あるファイルの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があることを確認します。id
arrayはその値を印刷し、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
ただし、記載されているフィールドの数によって書式設定が多少面倒になることがあります。