web-dev-qa-db-ja.com

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

私は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

File2:

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よりもはるかに多くの行があります。column1に基づいてファイル2にある行のみを出力に保持したいと思います。

参加しようとしましたが、正しく機能しません-ファイルがソートされていないことがわかります

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のcolumn1のすべての行がfile2にあるわけではありません。

Awkコマンド

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

ファイル2にある行の量だけを保持します。しかし、理想的には、例ARS-BFGL-10975を2回(実際にはもっと多く)繰り返して、出力に2回表示することです。

これまでの助けをありがとう

2
user160927

サンプルデータの使用:

$ 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は必要ありません(これはGNU join拡張子です)。

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

sortの場合、-k1も同様にデフォルトと同等です。

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

2
Kusalananda

Awkコマンドの場合、file1のキーがfile2に表示されているかどうかを確認するためのチェックが欠落しているだけです。

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