共通パターンですが、複数の接続で2つのファイルを結合します。

共通パターンですが、複数の接続で2つのファイルを結合します。

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)が処理され、テーブルにa3番目のセミコロンで区切られたフィールド値のエントリが含まれている場合、その値は行に追加されます。

「ファイル別フィールド区切り記号」を指定できないため、-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

おすすめ記事