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

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

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

  • Использование grep / awk / sed для сортировки и объединения двух файлов
  • Вам нужно сравнить два файла и распечатать все столбцы, а затем отобразить как NA, а затем присоединиться к другому файлу
  • Awk сравнивает 2 файла, распечатывает совпадение вместе с несоответствующими строками, заполненными 0
  • Слияние столбцов двух файлов в порядке
  • Awk: сравнить два файла
  • Присоединение всех mp3-файлов в файле m3u в один mp3-файл
  • Усеченный результат, возвращаемый JOIN
  • Вставить несколько файлов на основе первого столбца в один файл
  • 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- 

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

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