2つのファイルがあります。
ファイル1(9月=タブ):
A1 bla blo bli 23 blp
A1 bla blo bli 21 blp
A1 bla blo bli 28 blp
B2 bla blo bli 32 blp
B2 bla blo bli 31 blp
B2 bla blo bli 35 blp
ファイル2(9月= ;
):
fli;flo;A1;flu;flc
fli;flo;A2;flu;flc
fli;flo;B1;flu;flc
fli;flo;B2;flu;flc
フィールド1の同じ値に対応するファイル1の5番目(数字)フィールドのすべての値のリストをファイル2の行に追加したいと思います。ここで、3番目のフィールドはファイル1の最初のフィールドと同じです。同じ。上記の入力例では、希望の出力は次のようになります。
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
awk
これを行うためのコマンド(またはその他)がありますか?
いくつかのテストを行いましたが、FNR==NR
まだ起動していません。
事前にありがとう
答え1
awk
次のコマンドを使用して操作を実行できる必要があります。
awk -F"\t" 'FNR==NR{if ($1 in a) {a[$1]=a[$1] ";" $5} else {a[$1]=$5}} \
NR>FNR{split($0,f,";"); $0=$0 ";" a[f[3]]; print}' file1 file2
(読みやすくするために2行に分けてください。)
これは、最初にfile1
ファイル(としてマーク)を読み取って処理するときに、同じ値に対応するすべての値を累積するFNR == NR
マッピングテーブルを作成します。a
$5
$1
2番目のファイル(NR>FNR
)が処理され、テーブルにa
3番目のセミコロンで区切られたフィールド値のエントリが含まれている場合、その値は行に追加されます。
「ファイル別フィールド区切り記号」を指定できないため、-F
選択したコマンドライン引数は、タブ区切りの最初のファイルに対して正確です。これは、2split()
番目のファイルを処理するときに関数を使用して「手動で」分割を実行し、結果を別の配列に保存してから、代わりにf
その項目(=フィールド)にアクセスする必要があることを意味します。f[number]
$number
(修正する私はStalin Vignesh Kumarの答えで、次のような言葉を修正しました。最後に、ファイルごとにフィールド区切り文字を指定できます。 )
あなたの例の入力について私は得ます。
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
答え2
$ awk 'FNR==NR{ a[$1]=a[$1]";"$5;next }{sub(";","",a[$3]);print $0";"a[$3]}' file FS=";" file1
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
答え3
$ awk 'NR==FNR{a[$1]=($1 in a ? a[$1] OFS : "") $5; next} {print $0, a[$3]}' OFS=';' file1 FS=';' file2
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
答え4
BEGIN
このブロックは、値から作成された各値のプレフィックスを含む配列を作成します。$1
$5
コード行
$ awk 'BEGIN { while ( (getline <"input.1") > 0) { a[$1]=a[$1] ";" $5; }; FS=";" }; '\
'{ if (a[$3]=="") a[$3]=";"; print $0 a[$3]; }' input.2
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35