web-dev-qa-db-ja.com

CSVファイルの前の一致から列を追加します

次の形式の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スクリプトでどのように行うことができるか考えていますか?

3
bachr

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
_
3
RomanPerekhrest

sed解決策:

sed -E '/^KEY/{s/([^;]*;){5}([^;]*).*/\2/;h;d};/;/{G;s/\n/;/}' file.csv
  • / ^ KEY/{s /([^;];){5}([^;])。*/\ 2 /; h; d}

行がKEYで始まる場合は、ホールドスペースの6番目のフィールドを保持し、行を削除します

  • /;/{G; s/\ n /; /}

行にフィールドが含まれている場合は、最後にホールドスペースを取得し、\ nを;に置き換えます。

3
ctac_

このsed-r's | ^(\ S +)(\ s +\S +)$ | s/^\1。*/\&\ 2/p | 'を実行することで、なんとか修正できました。 file2 | sed -nf --file1

サーバーが置かれているESXの名前の列をCSVファイルに追加する必要があるという問題に直面しています 別のファイルからの条件付き検索に基づいてフィールドをcsvに追加します

0
XtC