Команда Unix, чтобы проверить, совпадают ли какие-либо две строки в файле?


24

Есть ли команда unix, которая может проверить, совпадают ли какие-либо две строки в файле?

Например, рассмотрим файл sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

Мы видим, что предложение

This is sentence X

повторяется

Есть ли какая-нибудь команда, которая может быстро обнаружить это, так что я могу выполнить ее так:

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

Ответы:


40

Вот один из способов получить точный результат, который вы ищете:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

Объяснение:

Внутренний $(sort sentences.txt | uniq -d)список каждой строки, которая встречается более одного раза. Внешний grep -nFxснова ищет sentences.txtточные -xсовпадения с любой из этих строк -Fи добавляет их номер строки.-n


Ваше редактирование едва ли превзошло меня в том, что я опубликовал точно такой же ответ. +1
Кейси

Таким образом, синтаксис $ (команда) работает как своего рода замена?
CodeBlue

2
@CodeBlue - да. Это называется командная замена
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtбудет немного более эффективным и позволит избежать потенциальных arg list too longпроблем.
Стефан Шазелас

10

Не совсем то, что вы хотите, но вы можете попробовать комбинировать sortи uniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2вот количество найденных дубликатов для строки man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

Если содержимое файла помещается в память, awkэто хорошо. Стандартный однострочный файл в comp.lang.awk (я не могу искать экземпляр с этой машины, но есть несколько раз в месяц), чтобы просто обнаружить наличие дублирования, awk 'n[$0]++'которое подсчитывает вхождения каждой строковой величины и печатает все вхождения кроме первого, потому что действие по умолчанию print $0.

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

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

Для ясности, показанные в нескольких строках, вы обычно работаете вместе в реальном использовании. Если вы делаете это часто, вы можете поместить awkсценарий в файл awk -f, или, конечно, целиком в сценарий оболочки. Как и большинство простых, awkэто может быть сделано очень похоже perl -n[a].

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.