最初の列の一致に基づいてファイルをマージ

最初の列の一致に基づいてファイルをマージ

2つのファイルがあります:File1

ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423261 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423263 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305

ファイル2:

ARS-BFGL-BAC-10975 10 21225382
ARS-BFGL-BAC-11025 10 84516867
ARS-BFGL-BAC-11193 1 29303546

希望の出力

ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546

したがって、ファイル1にはファイル2よりも多くの行があります。出力の列1に基づいてファイル2の行だけを維持したいと思います。

Joinを試しましたが、うまくいきません。私のファイルがソートされていないというメッセージが表示されます。

join -j 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,2.3 <(sort -k1 file1) <(sort -k1 file2)

可能であれば、awkコマンドを好みます。ファイル1は非常に大きいです。頑張りました

awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > output

どんな助けでも大変感謝します。ありがとう

申し訳ありません。以下に説明することはできませんが、ファイルを明確にするために、ファイル1の列1のすべての行がファイル2にあるわけではありません。

awkコマンド

awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' 

ファイル2の行数だけが保持されます。しかし、理想的に私が望むのは、例えばARS-BFGL-10975を2回(実際にはもっと多く)繰り返し、私の出力に2回現れることです。

これまで助けてくれてありがとう

答え1

サンプルデータの使用:

$ join <(sort file1) <(sort file2)
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546

これ現れる出力の行順序(ここで並べ替えられているので、これがあなたにとって重要かどうかはわかりません)に加えて、必要な操作を実行できます。

デフォルトの結合フィールドは最初のフィールドなので、-j 1必要ありません(GNUjoin拡張です)。

デフォルト出力join: 「各出力行は、連結フィールド、file1 の残りのフィールド、file2 の残りのフィールドで構成されます」(fromOpenBSD マニュアル)。これは、使用する出力フィールドの仕様がデフォルトの動作と一致するため、必要ないことを意味します。

の場合、sortデフォルト値-k1と同じです。

誤って使用した以外に表示されるエラーメッセージの原因が何であるかわかりませんsort -c

答え2

awkコマンドの場合、file1のキーがすでにfile2に表示されていることを確認することがありません。

awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' file2 file1 > output
# ................................^^^^^^^

関連情報