ファイルのある列を別の列と比較し、一致する場合は列を追加します。

ファイルのある列を別の列と比較し、一致する場合は列を追加します。

あるファイルの1つの列を別のファイルの別の列と比較したいと思います。列が一致したら、最初のファイルの最初の列を2番目のファイルの最初の列として追加したいと思います。

ファイル1

FID IID
456 2
123 1
789 3
112 4

ファイル2

IID column1 column2 column3... column464
1 Value11 Value12 etc etc ... etc
7 Value71 Value72 etc etc ... etc
2 Value21 Value22 etc etc ... etc
6 Value61 Value62 etc etc ... etc
3 Value31 Value32 etc etc ... etc

希望の出力

FID IID column1 column2 column3... column464
123 1 Value11 Value12 etc etc ... etc
456 2 Value21 Value22 etc etc ... etc
789 3 Value31 Value32 etc etc ... etc

答え1

使用awk:

awk 'NR==FNR { id[$2]=$1; next } ($1 in id){ print id[$1], $0}' file1 file2

最初の演算ブロックでは、file1 を次の連想配列に読み込みます。idここで、キーは$ 2列、値は$ 1列です。NR==FNR最初の入力ファイルを処理するときに常にtrueの条件は、awkの内部環境変数とNR(窒素数量ecords)はFNR(Fエリー窒素数量ecord)、FNR は次の入力ファイルごとにリセットされます。

次に、次のワークブロックは、file2の最初の列$ 1があることを確認します。idarrayはその値を印刷し、id[$1]その後にfile2の$ 0の行全体が表示されます。

答え2

限られた数のフィールドについては、以下を試してください。

join -12 -21 -o1.1,0,2.2,2.3,2.4  <(sort -nk2,2 file1) <(sort -n file2) 2>/dev/null
FID IID column1 column2 column3...
123 1 Value11 Value12 etc
456 2 Value21 Value22 etc
789 3 Value31 Value32 etc

ただし、記載されているフィールドの数によって書式設定が多少面倒になることがあります。

関連情報