bash - 如何查找文件中两个第一个单词与上一行和下一行不同的行
问题描述
考虑以下文件:
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
任何想法?
解决方案
案例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
}
'
推荐阅读
- jquery-animate - 上下文未定义
- reactjs - React - 不会在状态更改时重新渲染
- mysql - 获取具有与唯一 ID 关联的特定值的计数
- json - Json'无法读取未定义的属性'数据''
- cluster-computing - 缩小时标记聚类不聚类
- python - “DLL 加载失败”尝试导入 cv(来自 OpenCV-python)
- php - mysqli_num_rows 总是返回 0
- sql - 和或在sql server的同一列中
- entity-framework-core - 上下文和实体位于不同项目中时的 EF Core 迁移
- fortran - 如何在 Fortran 派生类型中存储对过程的引用