web-dev-qa-db-ja.com

2つのリスト間のgrep

Linuxマシンに2つのファイルがあります。最初の "list.txt"にはオブジェクトのリスト(2649オブジェクト)が含まれ、2番目の "list_interactors.txt"には以前のリストのオブジェクトの一部(719オブジェクト)を含む短いリストが含まれており、それぞれに他のオブジェクトがあります関連するいくつかの変数の列。ファイル「list_interactors」内の特定のオブジェクトに関連付けられた変数を持つすべてのオブジェクト(2649)のリストを取得したいと思います。

例:

ファイルlist.txt

6tyr_A_002__________
7yer_2_009__________
3erf_1_001__________
2dr5_D_2-3__________

ファイルlist_interactors.txt

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX

output.txt

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________

私はプログラミング言語についてあまり実用的ではありません。このスクリプトで関数grepを使用してみます。

grep -f list.txt list_interactors.txt

しかし、出力は「list_interactors.txt」のようなファイルです。

私を手伝ってくれますか?

3
Tommaso
$ join -a 1  <( sort list.txt ) <( sort list_interactors.txt )
2dr5_D_2-3__________
3erf_1_001__________ 3erf2_B QAEF6R XXXXX
6tyr_A_002__________ 6tyr1_B QRT54R AAAAA
7yer_2_009__________

これはjoinを使用して、2つのファイル間でリレーショナルJOIN操作を実行します。最初のフィールドは、デフォルトで結合キーとして使用されます。

-a 1オプションは、2番目のファイルに一致がない場合でも、最初のファイルのすべての行をjoin出力します(「左結合」を行います)。

joinへの入力データをソートする必要があります。これを行うには、コマンドラインで2つのプロセス置換を使用して、各ファイルでsortを個別に呼び出します。ファイルの事前ソートを選択することもできます。

データがタブ区切りの場合は、joinコマンドの引数の先頭に-t $'\t'を追加することをお勧めします。これにより、既存のタブ区切り文字が出力に保持されます。

ファイルに保存する場合は、コマンドの最後に>output.txtを追加して出力をリダイレクトします。

12
Kusalananda

並べ替えを維持したい場合は、awkを使用できます。

awk '
    FNR==NR {s[$1]=$0}
    FNR!=NR {if(s[$1]) print s[$1]; else print $0}
' list_interactors.txt list.txt

出力:

6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________
4
pLumo
$ awk 'NR==FNR{a[$1]=$0; next} {print ($1 in a ? a[$1] : $0)}' list_interactors.txt list.txt
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
2dr5_D_2-3__________
0
Ed Morton

Perlの1つのライナーでも実行できます。

$ Perl -ane ' { chomp;$s{$F[0]}=$_; } END { print "$s{$_}\n" for sort(keys(%s))  }' list.txt list_interactors.txt 
2dr5_D_2-3__________
3erf_1_001__________    3erf2_B    QAEF6R   XXXXX
6tyr_A_002__________    6tyr1_B    QRT54R   AAAAA
7yer_2_009__________