Использование чисел в файле A для получения уникального идентификатора из файла B на основе порядка, указанного в файле A

Использование чисел в файле A для получения уникального идентификатора из файла B на основе порядка, указанного в файле A

Я хочу использовать номера файлов 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

Связанный контент