ファイルの番号を使用して、ファイルで指定された順序に基づいてwhitelist.txt
ファイルから一意の識別番号を取得します。例:list.txt
whitelist.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 のそれらの行が印刷されます。2p
sed
2
sed -n '2p'
whitelist.txt
2p
5p
7p
代替案: 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.txt
Perl
qx[]
backquote
次に、2番目の引数、つまり
list.txt
行番号がのメンバーであるファイルの行を出力します。注: $. は常に数値であり、0より大きいため、 propah ではなくhash
%h
just を使用するだけで済むのはそのためです。$h{$.}
exists $h{$.}
結果
172363
612851
172418
19
72457