Команда 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 - так. Це називається Command Substitution
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtбуло б трохи ефективніше і уникало б потенційних arg list too longпроблем.
Stéphane Chazelas

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.