の内容を読んだ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