次の形式のCSVファイルがあります(;
区切り記号)。
KEY;..;..;..;..;id1;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
KEY;..;..;..;..;id2;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
id
で始まる各行から(列6)を取得し、で始まる次のKEY
行に追加する必要がありますSUBKEY
。したがって、結果は次のようになります。
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2
Bashスクリプトでこれを行う方法を知っていますか?
ベストアンサー1
Awk
解決策:
awk 'BEGIN{ FS = OFS = ";" }
$1 == "KEY"{ id = $6; next }
{ print $0 (NF? OFS id : "") }' file.csv
FS = OFS = ";"
-;
フィールド区切り記号(FS
)と出力フィールド区切り記号(OFS
)として扱われます。$1 == "KEY"{ id = $6; next }
- 最初のフィールドが$1
6番目のフィールドの"KEY"
文字列セット変数と同じ場合。次のレコードに強制移動します(現在のレコードをスキップ)。id
$6
next
awk
print $0 (NF? OFS id : "")
- レコードにフィールドがある$0
場合(組み込み変数として保証)、レコード全体を印刷/出力します。つまり、レコードが空でない場合 - レコードの末尾に (as ) と現在の値を追加します。NF
;
OFS
id
出力:
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2