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」のようなファイルです。
私を手伝ってくれますか?
$ 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
を追加して出力をリダイレクトします。
並べ替えを維持したい場合は、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__________
$ 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__________
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__________