Соедините два файла в двух общих полях

Я столкнулся с этим на своей OS X " Terminal "на хосте Fedora Server 25. Я окончательно решил эту проблему в моем .vimrc с помощью:

set mouse=
set ttymouse=

Теперь я могу прокрутить до моей предыдущей истории bash в прокрутке моего терминала с помощью мыши.

{{ 1}}
5
22.02.2016, 23:03
4 ответа
awk -F'|' 'NR==FNR{e[$2$1]=1;next};e[$4$8]' file2.txt file1.txt

Сначала прочтите файл2 и установите массив e [поле2 + поле1] , затем файл1 и напечатайте, если установлено e [field4 + field8] .

Или переверните поля:

awk -F'|' 'NR==FNR{e[$1$2]=1;next};e[$8$4]' file2.txt file1.txt
5
27.01.2020, 20:33

попробуйте

awk 'BEGIN { FS="|"}
     FNR == NR { key[$2 $1]=NR }
     FNR > NR { k=$3 $8 ;if (k in key)  print ;} ' file2.txt file1.txt

где

  • BEGIN {FS = "|"} скажите aw использовать | в качестве разделителя (вы можете использовать -F \ | в командной строке)
  • FNR == NR {key [$ 2 $ 1] = NR} запомнить ключ из файла (в файле file2.txt)
  • FNR> NR {k = $ 4 $ 8; if (k в ключе) print;} если введите хэш-список, распечатайте его

Изменить: вы упоминаете третье поле и присоединяетесь к четвертому.

2
27.01.2020, 20:33

Проще, предполагая, что в файле2 не разрешено указывать одно и то же первое поле дважды:

awk -F'|' 'FNR == NR { key[$1] = $2; next } $8 in key && key[$8] == $4' file2.txt file1.txt
3
27.01.2020, 20:33

Вопрос помечен как , но я думаю, стоит отметить, что у вас нет , чтобы использовать awk для этого. В coreutils есть утилита join , которая полезна для такого рода вещей, хотя с вашими данными она немного громоздка.

Я предполагаю, что ваша оболочка - это bash и GNU coreutils. Это можно сделать с другими вариантами, но, вероятно, потребуется дополнительная предварительная / постобработка ваших данных.

Без лишних слов:

join -t"|" -14 -22 -o"$(echo 1.{1..8} 2.1)" \
  <(sort -t"|" -k4 file1.txt) \
  <(sort -t"|" -k2 file2.txt) \
  | grep -Po ".*([\d]+)(?=\|\1$)"

join принимает два входных файла и объединяет их в полях, переданных с параметрами -1 и -2 . -t указывает настраиваемый разделитель полей во входных файлах. join требует, чтобы входные файлы были отсортированы по объединяемым полям, поэтому два входных файла сортируются в рамках подстановок процессов перед передачей в join . Параметр -o определяет способ вывода полей. По умолчанию это поле соединения, за которым следуют поля без соединения файла file1, за которыми следуют поля без соединения файла file2, поэтому нам нужно указать, что мы хотим, чтобы все поля файла 1 были по порядку, а затем поле 1 файла 2.

Вам также необходимо, чтобы соединение было в поле 8 файла file1 и поле 1 файла file1. Здесь это просто реализуется путем поиска строк при совпадении выходных полей 8 и 9 соединения. Использование упреждающего выражения регулярного выражения с grep -Po позволяет нам сделать это и эффективно удалить поле 9, чтобы получить требуемый результат. Результат:

78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
4
27.01.2020, 20:33

Теги

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