Попробуйте tail
плюс однострочник perl, например:
tail -n +2 input_file | \
perl -F'/[|]|\s+/' -lane '
print join( q{|}, @F[1..$#F]) if $seen{ $F[1] }++ == 2;'
Печать:
G1A114071803436|D4A928|FiOS-Gen4
G1A114080901301|D4A928|FiOS-Gen4
Здесь tail -n +2
пропускает первую строку (заголовок) , Это необязательно, но я предпочитаю его для надежного, чистого кода и результатов ниже по течению.
Однострочный perl использует следующие флаги командной строки:
-e
: говорит Perl искать код в строке, а не в файле.
-n
: l oop по одной строке за раз, присваивая ей значение $_
по умолчанию.
-l
: удалите разделитель строки ввода ("\n"
в * NIX по умолчанию) перед выполнением кода в и добавьте его, когда print
-ing.
-a
: разбить $_
на массив @F
на регулярное выражение, указанное в опции -F
.
-F'/[|]|\s+/'
: при разбиении на @F
, используйте это регулярное выражение: труба (|
) или один или несколько пробелов (\s+
).
Код сохраняет количество раз, когда 2-е поле (серийный номер) было замечено. Для этого он использует $seen{ $F[1] }++
. Обратите внимание, что массивы в Perl имеют индекс 0.
Когда счет равен 2 (то есть, когда он становится равным 3 после автоинкремента), выполняется print
.
Если вы хотите напечатать всю строку, просто используйте print
без аргументов, что совпадает с print $_
. Однако здесь все столбцы, кроме первого (индексы: 1..$#F
), объединяются в |
и печатаются.