Сравните два файла по первому столбцу. Сохранять строки при совпадении [закрыто]

0
18.06.2018, 18:28
2 ответа

Эта работа лучше всего подходит для языка программирования, а не языка сценариев, потому что вы работаете не только с одним потоком. Один базовый алгоритм будет:

  1. Прочитать первый файл построчно. Создайте список всех первых элементов. (В зависимости от языка, который вы используете, наиболее эффективными могут быть хэш или диктофон.)
  2. Прочитать второй файл построчно. Если в вашем списке существует первый элемент из #1, сохраните его в выходной файл.
0
28.01.2020, 02:42

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

Так как первый файл содержит текст только в первом столбце (, а остальные числа ), мы могли бы просто использовать для этого 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.

2
28.01.2020, 02:42

Теги

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