Программа командной строки Perl ("one" -liner), предполагающая наличие в файле не чисел, а чисел
perl -wnE'
@n = /([0-9]+)/g;
say "@n" if not grep { exists $seen_nums{$_} } @n;
%seen_nums = map { $_ => 1 } @n
' data.txt
Это печатает желаемый вывод. Также печатается самая первая строка (правильно). Так как программа разбирает строки на числа, она может использоваться для файлов с заголовками, только текстовыми строками (комментариями?) И т. Д.
Но если данные обязательно содержат только цифры, то мы можем использовать -a
переключатель Perl , с которым слова в каждой строке доступны в массиве @F
. Также немного сжался, чтобы вписаться в линию
perl -wlanE'grep exists $n{$_}, @F or say; %n = map { $_=>1 } @F' data.txt
Краткое описание переключателей (см. Документы, связанные выше)
-w
включает предупреждения
-l
снимает символ новой строки и может добавить его обратно, с еще несколькими тонкостями
-a
включает «автоматическое разделение» (при использовании с -n
или -p
), так что в программе доступно @F
, которое содержит слова в строке. На более новых Perls это также устанавливает -n
-n
Критично для обработки файлов или STDIN
- открывает ресурс и настраивает цикл по строкам. Запустите с -MO=Deparse
, чтобы увидеть, что он делает
-E
-e
- это то, что заставляет его оценивать все между следующими кавычками как код Perl. С капиталом (E
) он также включает функцию s, которую я использую в основном для say
. (У этого есть недостатки, так как он включает все функции и делает вещи обратно несовместимыми.)
Примечание: первая строка может быть опущена путем добавления условия $.!=2
к отпечатку