awkを使用して2つの別々のファイルから選択列をマージする新しいファイルを作成するには?両方のファイルの要素の順序を混同しません。
例:ファイル3には、ファイル1の列1、2、3、およびファイル2の列4を含めることができます。
File 1
A 23 8 T
A 63 9 9
B 45 3 J
File 2
A 0
A 6
B 5
File 3
A 23 8 0
A 63 9 6
B 45 3 5
答え1
これを行う専用のツールがあります。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と一致させ、ファイル1の行2をファイル2の行2と一致させたいと仮定していました。列の内容を一致させたい場合は、これはまったく異なるものです。join
一致する列がソートされている場合、これは行われます。
答え2
この試み:
$ 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