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

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

Пример входного файла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- 

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

  • Объединение двух CSV по сравнению только с определенным столбцом
  • Усеченный результат, возвращаемый JOIN
  • Присоединить (большие) файлы по алфавитно-цифровому шаблону
  • Присоединить два несортированных файла к POSIX?
  • Присоединение всех mp3-файлов в файле m3u в один mp3-файл
  • Сценарий оболочки для объединения двух файлов
  • сравнить файлы по строкам и создать новое одно bash-программирование
  • Как обновить три файла CSV на основе четвертого файла
  • Слияние столбцов двух файлов в порядке
  • объединить файлы csv, сохранить запятую внутри кавычек
  • Как узнать общие элементы между двумя файлами?
  • Linux и Unix - лучшая ОС в мире.