2つの別々のファイルの列をマージする


10

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

回答:


4

これを試して:

$ 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

ありがとう!私もgawkを使用してこの方法をうまく試しました:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah

2
@Dovah:でpaste file1 file2選択したフィールドを使用して印刷できますawk
cuonglm 14

これfile2はメモリに保存されますが、ファイルが大きい場合は禁止されます。メモリオーバーヘッドなしでこれを行う簡単な方法があります(私の回答を参照)。
Gilles「SO-邪悪なことをやめよう」14

17

そのための専用ツールがあります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照合する列がソートされている場合は、ジョブが実行されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.