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

У меня есть легкая функция оболочки для него (вставленный .bashrc), который использует sed

printLine () 
{ 
    sed -n -e "$1p" "$2"
}

Можно легко использовать его

$ printLine 2000,2250 file

Я использую функцию, потому что я всегда забываю корректное sed- синтаксис.

Вы хотите сохранить вывод в другом файле, чем это легко:

$ printLine 2000,2250 file > output
24
06.02.2014, 01:49
3 ответа

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

$ 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

40
27.01.2020, 19:41
  • 1
    Ваше редактирование едва-едва избило меня от регистрации того же самого ответа. +1 –  casey 05.02.2014, 20:40
  • 2
    Таким образом, $ (команда) синтаксис работает как своего рода замена? –  CodeBlue 05.02.2014, 21:27
  • 3
    @CodeBlue - да. Это назвало замену –  grebneke 05.02.2014, 21:29
  • 4
    sort sentences.txt | uniq -d | grep -nFxf - sentences.txt было бы немного более эффективным и избежит потенциала arg list too long проблемы. –  Stéphane Chazelas 06.02.2014, 11:34

Не точно, что Вы хотите, но можно попытаться объединиться 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
10
27.01.2020, 19:41

ЕСЛИ содержание файла умещается в памяти 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].

6
27.01.2020, 19:41

Теги

Похожие вопросы