ファイルを参照し、最初の列で一致するものを検索し、一致する行を印刷するループ

ファイルを参照し、最初の列で一致するものを検索し、一致する行を印刷するループ

2つのファイルがあります。ファイル1は、単一の列に191行の入力ファイルです。ファイル2は、2つの列と712行の基本ファイルです。

出力 = Input_File と Master_File の最初の列の間で一致する項目を見つけ、行に一致する Master_File の行を印刷します。

入力ファイルの例:

2190
2209
2214
2234
2261
2287
2303
2320
13773
29292

マスターファイルの例:

945713 Ignavibacterium_album_JCM_16511_uid162097
521045 Kosmotoga_olearia_TBF_19_5_1_uid59205
1254432 Sorangium_cellulosum_So0157_2_uid210741
1144275 Corallococcus_coralloides_DSM_2259_uid157997
59374 Fibrobacter_succinogenes_S85_uid41169
741091 Rahnella_Y9602_uid62715
83332 Mycobacterium_tuberculosis_H37Rv_uid57777
103690 Nostoc_PCC_7120_uid57803
115713 Chlamydophila_pneumoniae_CWL029_uid57811
158879 Staphylococcus_aureus_N315_uid57837

forループでgrepを使用しようとしています。

for i in $(cat Input_File); do grep $i Master_File; done

ただし、このコマンドはMaster_Fileの両方の列で一致するものを検索します。

awkを使用して最初の列のみを印刷する方法を知っていますが、一致する行を印刷する目的は、Master_Fileから2番目の列情報を取得することです。

awkを使用してMaster_Fileの最初の列を印刷し、Input_Fileを参照してforループを使用して一致するものを見つけて、Master_Fileで一致する行を印刷できますか?

それとも、より簡単なコマンド方法に関する提案はありますか?

ベストアンサー1

このawkコマンドを試してください

awk 'NR==FNR{Arr[$0]++;next}{if($1 in Arr){print $0}}' input_file master_file

入力ファイルを読み取り、内容を配列に保存してから、2番目のファイルを繰り返して、最初の列の値が配列にあることを確認します。配列に存在する場合は、master_file行を印刷します。

おすすめ記事