回答:
これを試して:
$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
paste file1 file2
選択したフィールドを使用して印刷できますawk
。
file2
はメモリに保存されますが、ファイルが大きい場合は禁止されます。メモリオーバーヘッドなしでこれを行う簡単な方法があります(私の回答を参照)。
そのための専用ツールがありますpaste
。最初のファイルの各行全体を2番目のファイルの対応する行と連結します。前または後に不要な列を削除できます。たとえば、列がタブ区切りであると仮定します。
paste file1.txt file2.txt | cut -f 1,2,3,6
以下は、ksh / bash / zshプロセス置換に依存する両方のファイルを事前にフィルタリングする方法です。
paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
<(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')
Awkは主に一度に1つのファイルを処理するようになっgetline
ていますが、別のファイルから並行して読み取るように呼び出すことができます。
awk '
BEGIN {file2=ARGV[2]; ARGV[2]="";}
{$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt
これまでのところ、ファイル1の1行目をファイル2の1行目と一致させたいと想定してきました。列の内容を一致させたい場合は、まったく別の問題。join
照合する列がソートされている場合は、ジョブが実行されます。
pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt