Как найти строки в файле, где 2 первых слова отличаются от предыдущей и следующей строки - PullRequest
1 голос
/ 22 марта 2019

Рассмотрим следующий файл:

word1 word2 word3
word1 word2 word3
word6 word7 word8
word6 word7 word9
word9 word10 word4
word1 word2 word5
word1 word2 word5

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

Ожидаемый результат:

word9 word10 word4

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 23 марта 2019

вариант 1: каждая строка имеет одинаковое количество слов (полей)

  • uniq может пропускать начальные поля, но не конечные поля
  • rev переворачивает символы в строке

Так как каждая строка имеет одинаковое количество полей (1 трейлинг), мы можем сделать:

<file rev | uniq -u -f1 | rev

вариант 2: произвольное количество слов в каждой строке

Мы можем написать сценарий awk, который отслеживает текущую и предыдущие две строки и печатает предыдущую, когда это необходимо:

awk <file '
{
    # does current line match previous line?
    diff = !( $1==p1 && $2==p2 )

    # print stashed line if not duplicate
    if (diff && pdiff) print p0

    # stash current line data
    pdiff=diff; p0=$0; p1=$1; p2=$2
}
END {
    # print the final line if appropriate
    if (pdiff) print p0
}
'
1 голос
/ 23 марта 2019

Полагаю, здесь есть некоторая избыточность, но она работает

$ awk             '{k=$1 FS $2} 
     k!=p && p!=pp {print p0} 
                   {p0=$0; pp=p; p=k} 
               END {if(p!=pp) print}' file


word9 word10 word4
...