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

答え2

入力した入力例を使用してフィールドがタブで区切られている場合は、必要なものは次のとおりです。

$ paste file1 <(cut -f2 file2)
x   y   z
1   3   5
2   4   19
6   9   9

またはスペースで区切られた場合:

$ paste -d' ' file1 <(cut -d' ' -f2 file2)
x y z
1 3 5
2 4 19
6 9 9

答え3

使用awk:

  • 方法1
    awk 'FNR==NR{a[FNR]=$2;next}{print $1,a[FNR],$2}' f1 f2
    
  • 方法2
    awk 'NR==FNR{a[$1];a[FNR]=$2;next}($1 in a) {print $1,a[FNR],$2}' f1 f2
    

出力

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

関連情報