2015-10-22 6 views
-2

У меня есть файл в следующем формате:печать линия количество повторяющихся записей

ABRA CADABRA 
ABRA CADABRA 
boys 
girls 
meds toys 

Я хотел бы иметь номер строки, возвращаемый любые дублирующие линии, так что результаты будут выглядеть следующим образом:

1 
2 

Я бы предпочел короткую однострочную команду с инструментами linux. Я пробовал экспериментировать с awk и sed, но пока не имел успеха.

+4

Является ли сортировка входного файла? Если нет, будут ли одинаковые несмежные строки учитываться как дубликаты? –

ответ

0

С комбинацией сортировки, uniq и awk вы можете использовать эту серию команд.

sort File_Name | uniq -c | awk '{print $2}' 
+0

Мне не нужен список отсортированных имен. – user3299633

+0

Затем используйте: cat File_Name | uniq -c | awk '{print $ 2}' –

+0

@BryanPoole: лучше обновите свой ответ, чем ответьте на комментарий, - и вам здесь не нужна кошка. Кроме того, вы это проверили? Я не думаю, что он делает то, что вы хотите. Для начала вывод 'uniq -c' переходит в первое поле. –

0

Это будет работать:

nl file.txt | uniq -f 1 -D | cut -f 1 
  • nl присоединяет номер строки для каждой строки
  • uniq находками дублирует
    • -f 1 игнорирует первое поле, т.е. номер строки
    • -D печатает (только) линии, которые являются дубликатом
  • cut-f 1 показывает только первое поле (номер строки)
+1

Не будет работать, если вход не отсортирован. – Michael

0

Здесь:

uniq -d < $file | while read line; do grep -hn "$line" $file; done 
0

ли это:

perl -e 'my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; } }' < FILE 

Уродливые, но работающие s для несортированных файлов.

$ cat in.txt 
ABRA CADABRA 
ABRA CADABRA 
boys 
girls 
meds toys 
girls 
$ perl -e 'my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; } }' < in.txt 
1 
2 
4 
6 
$ 

EDIT: На самом деле это позволит сократить немного:

perl -ne '$l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]\n"; print "$l\n"; } } else { $f{$_} = [1,$l]; }' < in.txt 
0

, чтобы получить все "разные" дубликатами во всех линиях, вы можете попробовать:

nl input.txt | sort -k 2 | uniq -D -f 1 | sort -n 

это не даст вам просто номера строк, а также дубликат, найденный в этих строках. Опустите последний вид, чтобы получить дубликаты, сгруппированные вместе.

также попробовать запустить:

nl input.txt | sort -k 2 | uniq --all-repeated=separate -f 1 

Это сгруппирует различные дубликаты, добавив пустую строку между группами дублей.

результаты трубы через

| cut -f 1 | sed 's/ \+//g' 

только получить номера строк.

0
$ awk '{a[$0]=($0 in a ? a[$0] ORS : "") NR} END{for (i in a) if (a[i]~ORS) print a[i]}' file 
1 
2 
Смежные вопросы