awkで2つのファイルの入力を結合します。

awkで2つのファイルの入力を結合します。

の内容を読んだawk。単一のデータに適していることがわかりました。 2つの入力ファイルがあるとしましょう。

## inp1
x y
1 3
2 4
6 9
... 

## inp2
x z
1 5
2 19
6 9

「結合された」2つのファイルの内容を出力したいと思います。それは次のとおりです。

## output
x y z
1 3 5
2 4 19
6 9 9

これら2つのファイルを次のようにインターリーブするアイデアを考えてみましょう。https://stackoverflow.com/questions/4011814/how-to-interleave-lines-from-two-text-filesそしてawkでいくつかのことをしましょう。

それとも、連想配列を使用するものがありますか?しかし、それが問題の原因であるかどうかはわかりません。 ;)

私はLinuxを使用しています。

ベストアンサー1

join最初のフィールドでファイルを結合したいようです。

$ join -j1 file1 file2 
x y z
1 3 5
2 4 19
6 9 9

入力がソートされると予想されるため、次のことが必要になる場合joinがあります。

$ join -j1 <(sort file1) <(sort file2 )
1 3 5
2 4 19
6 9 9
x y z

ただし、これを行うとヘッダーがめちゃくちゃになるので、これを防ぐには次のようにします。

$ join -j1 <(head -n1 file1) <(head -n2 file2); join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort )
x y z
1 3 5
2 4 19
6 9 9

新しいファイルに保存します。

( \
    join -j1 <(head -n1 file1) <(head -n2 file2); 
    join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort ) \
) > newFile

または以下を使用してくださいawk

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,$2,a[$1]}' file2 file1 
x y z
1 3 5
2 4 19
6 9 9

おすすめ記事