Разделить файл, сравнивая два поля в файлах

Имейте два файла, которые должны сравнивать первые два столбца.

Пример входного файла1:

|CID|SID|order|orderdate|confirmdate |151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32 |151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47 |151244127824|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48 |151244127824|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11 |151244127825|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02 |151244127827|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31 |151244127827|7177638968972| 3|2015-02-04 07:17:36|2015-02-04 07:36:22 

input file2:

 |cID|SID|order|orderdate|confirmdate |151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32 |151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47 |151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48 |151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11 |151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02 |151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31 |151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22 

Если CID во входном файле2 не найден в файле1, тогда напишите полную строку в новом файле. И если CID во входном файле2 найден в файле1, но SID не найден, напишите полную строку в новом файле.

  • Я хотел бы присоединиться к двум файлам csv
  • сопоставить столбцы и заменить
  • присоединить несколько строк на основе столбца1
  • как pdfjoin пейзаж и портретные изображения JPEG в один файл PDF?
  • Как узнать общие элементы между двумя файлами?
  • Вставить несколько файлов на основе первого столбца в один файл
  • Как присоединиться к файлам с необходимыми столбцами в Linux?
  • Объединить строки с совпадающим первым столбцом
  • 3 Solutions collect form web for “Разделить файл, сравнивая два поля в файлах”

     awk -F'|' 'FNR==NR{a[$2]=$2;b[$3]=$3;next};{if($2 in a){print $0 > "new_file_1"};if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"}} file1 file2 

    Детали …

     {if($2 in a){print $0 > "new_file_1"} : if SID in file2 matches SID in file1 redirect to a file called new_file_1 

    ..

     if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"} :if SID in file2 matches SID in file1 but CIDs does not match, redirect to a file called new_file_2 
     awk -F'|' ' FNR==NR{ cid[$2]=1 sid[$3]=1 next } { if (!($2 in cid)) print else if (!($3 in sid)) print }' file1 file2 

    Краткое объяснение:

    Создайте два уникальных массива (значения cid и sid ) из первого файла.

    Затем сравните его со вторым и третьим полями (первое поле отсчитывается от начала строки до первого делиметра, так что оно пусто) каждой строки второго файла и, в соответствии с условиями, строки печати.

    Я думаю, что это получает то, что вы хотите:

     for n in 3 0 do nl -w1 -s."$n" <&"$n" done 3<file1 <file2 | sort -t\| -unk2,2 -nk3,3 | sort -t\| -nk1,1 | grep '^[^|]*0|' 

    … которые в моих тестах напечатаны …

     4.0|151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48 5.0|151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11 6.0|151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02 7.0|151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31 8.0|151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22 

    И посмотрите – это не только очень просто (и, вероятно, очень быстро даже для очень больших входов), но вы даже можете сохранить номера строк. Но если вы не хотите их, вы можете просто добавить …

     ... | cut -d\| -f2- 

    … к хвосту трубопровода.

    Interesting Posts

    ps, чтобы показать только процессы, которые соответствуют более чем одному условию (AND)

    lxde: активное окно в lxpanel Плагин панели задач (список окон) неотличим от других (неактивных)

    Как сделать автоматический запуск dnscrypt-proxy в Fedora 25

    Когда ни один сервер dhcp не отвечает, как заставить dhclient использовать статический лизинг из dhclient.conf вместо предыдущего аренды dhcp?

    Разрешения, установленные для новых файлов и папок по умолчанию ACL

    Изменение разрешений по умолчанию для wget?

    Установка Ubuntu / Debian на SD-карту на 16 ГБ

    stout не может присоединяться к большим файлам

    Как создать виртуальный вывод в PulseAudio?

    Конвертировать постоянную файловую систему Debian Live USB в автономную установку

    Xorg: подключить удаленный дисплей

    Wind River Linux, ошибка неудачной зависимости

    как создать отдельный процесс в фоновом режиме при запуске переднего плана

    Восстановить полную команду, сгенерированную дампом ядра

    Как рассчитывается размер каталога?

    Linux и Unix - лучшая ОС в мире.