Файлы слияния с помощью общего значения столбца

Я хочу присоединиться к этим 2 файлам: Файл 1 (1 миллион строк) и Файл 2 (10 000 строк) в новом Файле 3 (должен быть 1 миллион строк), использование awk команда

Файл 1:

 471808241 29164840 1 10001 156197396 
 471722917 21067410 1 31001 135961856 
 471941441 20774160 1 7001  180995072 
 471568655 29042630 1 15001 157502996 
 471524711 20716360 1 4001  180226817 
 471873918 29583520 1 2001  128567298 
 471568650 29042631 1 15002 157502910 

Файл 2

610146 156197396 
531101 135961856 
704011 180226817 
502216 128567298 
707012 180995072 
615246 157502996 
685221 157502910 

Желаемый вывод:

471808241 29164840 1 10001 156197396 610146 
471722917 21067410 1 31001 135961856 531101 
471941441 20774160 1 7001  180995072 707012 
471568655 29042630 1 15001 157502996 615246 
471524711 20716360 1 4001  180226817 704011 
471873918 29583520 1 2001  128567298 502216 
471568650 29042631 1 15002 157502910 685221
3
задан 26 February 2017 в 15:59

2 ответа

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

awk 'NR==FNR {a[$2]=$1; next} {$(NF+1) = a[$NF]} 1' file2 file1 > file3

Примечание, что Вы не указываете то, что должно быть сделано в случае, что там не идет ни в какое сравнение - в этом случае, это добавит пустое поле. Если это не желаемое поведение, можно протестировать, существует ли $NF в a сначала.

2
ответ дан 1 December 2019 в 15:22

Если Вы не возражаете сортировать файлы, Вы могли бы использовать join (хотя это не могло бы быть практично для Вашего случая, это интересно видеть, как это могло бы быть сделано),

Первый вид File 2 на общем числовом поле

sort -k2 "File 2" > file2clean

Затем Вы можете join эти два файла

sort -k5 "File 1" | join -a 1 -o 1.1 1.2 1.3 1.4 0 2.1 -1 5 -2 2 - file2clean | tee "File 3"

Примечания

  • -a 1 распечатайте строки в File 1 это не может быть соединено (так как этот файл имеет больше строк, я предполагаю, что это - то, что Вы хотите),
  • -o 1.1 1.2 1.3 1.4 0 2.1 полевой порядок на выходную строку - поле, на котором мы присоединяемся, 0, и 1.1 первое поле первого файла и так далее
  • -1 5 -2 2 соединение на 5-м поле первого файла и 2-м поле второго файла
  • - file2clean здесь - представляет стандартный вход, провел конвейер, т.е. отсортированную версию File 1

При выполнении можно удалить промежуточное звено file2clean.

4
ответ дан 1 December 2019 в 15:22

Другие вопросы по тегам:

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