Как заставить звездочку '*' в zsh вести себя так же, как bash?

Вы хотите извлечь все строки из первого файла, первый столбец которых соответствует столбцу второго файла.

Так как первый файл содержит текст только в первом столбце (, а остальные числа ), мы могли бы просто использовать для этого grep.

В bashили любой другой оболочке, которая понимает подстановки процессов, это будет вопрос

grep -F -f <( awk -F, 'NR > 1 { print $1 }' <file2 ) file1 >newfile

В других оболочках вы должны сначала записать вывод команды awkво временный файл, а затем использовать его с grep -f.

awkбудет генерировать вывод, подобный

p10_1003_length_529_cov_12.940299
p10_1021_length_525_cov_6.801508
p10_1047_length_521_cov_4.852792
p10_1152_length_501_cov_22.430481
p10_139_length_1152_cov_892.463415
p10_149_length_1130_cov_7.540379

и grepбудут использовать их как шаблоны фиксированных строк для сопоставления с каждой строкой в ​​вашем первом файле.

Вы могли бы сделать все это и в awk, что включало бы сначала чтение в первом столбце второго файла как ключи в ассоциативном массиве, а затем проверку первого столбца первого файла по этим ключам :

. ]
awk -F, 'NR==FNR && FNR>1 { keys[sprintf("\"%s\"", $1)] }
         NR!=FNR && FNR>1 && ($1 in keys)' file2 file1

Странное sprintf()здесь потому, что первый столбец в file1заключен в двойные кавычки. Он просто добавляет двойные кавычки к данным, считанным из file2.

FNR>1пропускает заголовки обоих файлов, в то время как NR==FNRверно, если мы читаем из file2.

4
29.05.2020, 01:19
0 ответов

Теги

Похожие вопросы