ファイルAの数字を使用して、ファイルAで指定された順序に基づいてファイルBから一意のIDを取得します。

ファイルAの数字を使用して、ファイルAで指定された順序に基づいてファイルBから一意のIDを取得します。

ファイルの番号を使用して、ファイルで指定された順序に基づいてwhitelist.txtファイルから一意の識別番号を取得します。例:list.txtwhitelist.txt

$ cat whitelist.txt:  
2  
5  
7  
10   
11
(+8,000 more lines)

$ cat list.txt  
2  
172363  
14  
17  
612851  
172414  
172418  
172419  
172424  
19  
72457  
(+ 150,000 more lines)

新しいファイルにリダイレクトできるようになります:

$ cat newfile.txt  
172363  
612851  
172418  
19   
72457  
(+8,000 more lines)

注: この質問は変更されました。2017 年 5 月 5 日より前の以下の回答は、(list.txt例: 最初の行) >CLocus_2_Sample_(数字 2 のみではなく) としてフォーマットされ、ファイル名がfile.fa( ではないfile.txt) である入力サンプル ( ) に基づいています。

答え1

修正されたデータに基づいて、次のようなことを試してください。

$ sed -nf <(sed 's/.*/&p/g' whitelist.txt) list.txt >newfile.txt

これにより、ファイルのエントリがwhitelist.txtから に変換され、outerにその行を印刷するよう2に指示します==> は に等しく、==> 2 行目を印刷します。 のすべてのエントリに対して同じことが行われ、、、などを含む sed スクリプト (プロセス置換を使用して outer sed をフィード) が作成され、list.txt のそれらの行が印刷されます。2psed2sed -n '2p'
whitelist.txt2p5p7p

代替案: whitelist.txt を前処理します。

sed 's/.*/&p/g' whitelist.txt >whitelist2.txt  #or sed -i '....' whitelist.txt to overwrite whitelist.txt
sed -nf whitelist2.txt list.txt # you can redirect output to >newfile.txt

答え2

最新の改訂版への返信:

awk 'NR==FNR{z[$1]; next}FNR in z' whitelist.txt list.txt >newfile.txt

答え3

あなたがおっしゃっている新しい仕様では、次のように変更する必要があります。

perl -e '
   $h{s/\n//r}++ for qx[cat ${\+shift}];
   $h{$.} && print while <>;
' whitelist.txt list.txt

説明

  • まず、コードに渡す必要がある最初の引数であるファイルhash %hの内容を使用して を入力します。演算子は演算子に他ならないことに注意してください。whitelist.txtPerlqx[]backquote

  • 次に、2番目の引数、つまりlist.txt行番号がのメンバーであるファイルの行を出力します。注: $. は常に数値であり、0より大きいため、 propah ではなくhash %hjust を使用するだけで済むのはそのためです。$h{$.}exists $h{$.}

結果

172363
612851
172418
19
72457

関連情報