次の形式のCSVファイルがあります(;
は区切り文字です):
KEY;..;..;..;..;id1;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
KEY;..;..;..;..;id2;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
id
で始まる各行からKEY
(6列目)を取得し、それをSUBKEY
で始まる次の行に追加する必要があります。したがって、結果は次のようになります。
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2
これをbashスクリプトでどのように行うことができるか考えていますか?
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番目のフィールド_$1
_が_"KEY"
_文字列と等しい場合-6番目のフィールド_$6
_でid
変数を設定します。next
は、awk
に次のレコードにジャンプするように強制します(現在のレコードをスキップします)print $0 (NF? OFS id : "")
-レコード全体を印刷/出力します_$0
_条件:NF
組み込み変数によって保証される)、つまりレコードが空でない場合-_;
_(OFS
として)を追加し、レコードの最後までの現在のid
値出力:
_SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2
_
sed解決策:
sed -E '/^KEY/{s/([^;]*;){5}([^;]*).*/\2/;h;d};/;/{G;s/\n/;/}' file.csv
行がKEYで始まる場合は、ホールドスペースの6番目のフィールドを保持し、行を削除します
行にフィールドが含まれている場合は、最後にホールドスペースを取得し、\ nを;に置き換えます。
このsed-r's | ^(\ S +)(\ s +\S +)$ | s/^\1。*/\&\ 2/p | 'を実行することで、なんとか修正できました。 file2 | sed -nf --file1
サーバーが置かれているESXの名前の列をCSVファイルに追加する必要があるという問題に直面しています 別のファイルからの条件付き検索に基づいてフィールドをcsvに追加します