Excelの塗りつぶし機能に似たテキストファイルの列を「塗りつぶす」コマンド

Excelの塗りつぶし機能に似たテキストファイルの列を「塗りつぶす」コマンド

その行内の行と列を含むテキストファイルがあります。基本的にExcelの「塗りつぶし」機能を複製したいと思います。つまり、行に空の「セル」がある場合は、その上の行を見つけて、上記の対応するフィールドの値で埋めます。たとえば、列区切り文字として「^」を使用します。

London^Paris^Moscow^Berlin
^^Melbourne^New York^Washington
^^^Sydney^Singapore^New Delhi
^^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
^^^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
^^Bucharest

...次のようになります(わかりやすくするために項目を大文字で入力)。

London^Paris^Moscow^Berlin
LONDON^PARIS^Melbourne^New York^Washington
LONDON^PARIS^MMELBOURNE^Sydney^Singapore^New Delhi
LONDON^PARIS^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
KUALA LUMPUR^BANGKOK^HONG KONG^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
AMSTERDAM^^Bucharest

したがって、デフォルトでは、この機能は空のフィールドを識別し、空のフィールドがある場合はその上の対応するフィールドから値を取得します。フィールド/列区切り文字を指定できることが重要です。どんなアイデアがありますか?

答え1

awk -F'^' -v OFS='^' \
   '{
        for (i = 1; i <= NF; i++) {
                if ($i == "") $i = save[i]
                else          save[i] = $i
        }
        for (i = NF+1; i <= 99; i++) save[i] = ""
        print
    }'

save これは、ある行から次の行までの値を保持するために呼び出される配列を使用します(下に塗りつぶし)。の内容はすべてawk暗黙的にnullに初期化されるため、配列にsaveデータが割り当てられるまで配列は空です。 (したがって、最初の行の空のフィールドはコピーする前のデータがないため空白のままです。)

各行について

  • 行()for (i = 1; i <= NF; i++)の各フィールドについて
    • 空の場合は、その列の保存された(コピーされた)値で埋め、
    • それ以外の場合は、後続の行で使用するために現在の値を保存します。
  • 次に、save現在行に存在しないすべての列の配列を消去します。たとえば、4つのフィールドしかない4行に達すると、3行の5列と6列に「Singapore」と「New Delhi」が含まれていることを「忘れます」。 7行(フィールドが1つだけ)に達すると、5行の2列に「Bangkok」が含まれているため、8行(2列が空)を入力できないことを「忘れます」。

    99 1行に表示されると予想されるフィールドの最大数に置き換えます。

関連情報