Я хочу использовать номера файлов 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)
ПРИМЕЧАНИЕ: Этот вопрос был изменен. Ответы ниже до 5 мая 2017 года основывались на входных образцах ( 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
файла из ie 2
в 2p
который указывает внешнему sed
вывести эту строку 2
==> равно sed -n '2p'
==> выводит вторую строку.
То же самое происходит для всех записей whitelist.txt
, создавая скрипт sed (снабжая внешний sed подстановкой процесса), содержащий 2p
, 5p
, 7p
, и т. д. и эти строки list.txt выводятся.
Альтернатива: Предварительная обработка 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
файл, номера строк которого являются членамиhash
%h
. Примечание: поскольку $. всегда является числовым и > 0, это причина, по которой мы можем обойтись использованием just$h{$.}
вместо propahexists $h{$.}
Полученные результаты
172363
612851
172418
19
72457