Извлечение делает запись с двойной областью в Unix (не используя uniq!)

У меня есть текстовый файл, состоящий из поля ключа переменной длины в области 1, и другие данные в области 2. Области отделены символом табуляции (" \t"). Поля ключа содержат места. Файл сортирован на поле ключа.

Я хотел бы отфильтровать это, чтобы создать файл, содержащий только те отчеты с двойными полями ключа (то есть, область 1), с дополнительной правильностью отделения групп отчетов с пустой строкой.

например.

01001|XYZ ZY|\tFOO MAN CHU\n
01001|XYZ ZY|\tBAR BAZ\n

01001|ZZZYYYXX|\tYACKETY YACK\n
01001|ZZZYYYXX|\tBOBBITY BOP\n
01001|ZZZYYYXX|\tTESTING TESTING\n

... и т.д., Другими словами, точно что uniq-d-D сделал бы, если бы это предоставило какие-либо возможности для дополнительных разделителей полей или областей переменной длины!

Есть ли некоторый способ достигнуть этого в команде, используя стандартные фильтры Unix?

0
nl ja de
используйте awk и его способность установить переменные, сравнить их, и т.д. (0$ целая текущая линия, НОМЕР является текущим номером строки, 1$... $n - текущие области (игнорирующий сепараторы, которые можно также изменить для входа и для продукции), и т.д.),
добавлено автор Olivier Dulac, источник

1 ответы

попробуйте awk, как olivier предполагает, если на solaris используют nawk вместо этого:

awk -F '    '  '{arr[$1]++; next} 
               END{for(i in arr)
                   {if(arr[i]>1) {print i}}  } ' infile > keyfile 

awk -F '    '  'FILENAME=="keyfile" {arr[$1]=1;next}
              FILENAME=="infile"  
                   {if( $1 in arr){print $0}} ' keyfile infile > newfile

This can be made shorter but more confusing for an awk newbie. The -F ' ' <- has a tab character between the ''.

awk -F '    '  'NR==FNR {arr[$1]++; next}                                  
              (NR>FNR && arr[$1]>1) {print} '   infile infile > newfile 

Более противный, чтобы понять версию

0
добавлено