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

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

Пример входного файла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 не найден, напишите полную строку в новом файле.

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- 

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

  • Вставить несколько файлов на основе первого столбца в один файл
  • Поиск совпадений между двумя столбцами разных файлов и печать его в другом столбце
  • сравнить файлы по строкам и создать новое одно bash-программирование
  • Как сортировать и присоединяться в соответствии с номером / счетчиком внутри файла?
  • Соответствие двух файлов для аналогичной первой строки
  • Присоединить два несортированных файла к POSIX?
  • Сравните старый файл и новый файл, но игнорируйте строки, которые существуют только в новом файле?
  • Как распечатать все записи в файле 1, но обратите внимание на записи, которые не соответствуют файлу2?
  • Awk: сравнить два файла
  • сравнить несколько файлов (более двух) с двумя разными столбцами
  • Объединение двух таблиц, включая многократное появление идентификаторов столбцов и уникальных строк
  • объединить файлы csv, сохранить запятую внутри кавычек
  • Interesting Posts

    Как искать историю консоли XTerm?

    Как быстро хранить и получать доступ к часто используемым командам?

    Оболочка xmllint не показывает число из выражения count xpath?

    Замените переменную, прочитанную из текстового файла (чтобы их можно было интерпретировать)

    как я могу остановить автоматическую консоль входа и getty в raspbian jessie

    Как узнать, включен ли волшебный ключ SysRq и какие ключи его вызывают?

    Воспроизведение Flac в Iceweasel

    Удалите последний символ перед другим символом

    Программа не заканчивается при вызове из udev

    Как бы я grep для записи файла паролей без использования 'username'

    Объединение существующих исходных папок в mksquashfs

    Заставить мой Linux (Ubuntu) спросить меня, что такое пароль SQL, поэтому я не буду хранить его в файле .sh?

    Интернет не работает при использовании статического IP-адреса. Никаких текущих решений не работает

    0 байт, созданный в простом скрипте

    Мысли о безопасности в Linux

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