首页 > 解决方案 > 如何查找文件中两个第一个单词与上一行和下一行不同的行

问题描述

考虑以下文件:

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

我搜索一个 shell 命令行来输出其中 2 个第一个单词与上一行和下一行不同的行。

预期输出:

word9 word10 word4

任何想法?

标签: bashshellawksh

解决方案


案例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
}
'

推荐阅读