web-dev-qa-db-ja.com

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

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
10
dovah

これを試して:

$ 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
4
cuonglm

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