寻找Linux命令:检测制表符分隔文件同列相邻行值相同并输出两行
解决方法:用awk检测连续行的指定列并输出
要实现这个需求,awk是最适合的工具——它能轻松处理列分隔的文本,还能跟踪上一行内容做比较。假设你的文件名为input.tsv,要检测的是示例里varXXX所在的第4列,可以用以下命令:
awk -F'\t' 'prev == $4 {print prev_line; print $0} {prev = $4; prev_line = $0}' input.tsv
命令逻辑拆解
-F'\t':指定制表符作为字段分隔符(如果你的文件实际是空格分隔,删掉这个参数就行,awk默认会处理空格分隔的字段)。prev == $4 {print prev_line; print $0}:对每一行先检查:当前行的第4列($4)和上一行的第4列值(prev)是否相同?如果是,就打印上一行的完整内容(prev_line)和当前行内容($0)。{prev = $4; prev_line = $0}:不管当前行是否匹配,都会更新prev为当前行的第4列值、prev_line为当前行完整内容,方便和下一行做对比。
适配不同列的情况
如果要检测的不是第4列,只需要把命令里的$4换成对应的列号就行。比如要检测第3列,就改成$3。
处理连续多行相同的场景
如果文件里有3行或更多行的目标列值连续相同,上面的命令会输出每一对相邻行(比如第1-2行、第2-3行都会被输出)。要是你希望只输出整个连续块、不重复中间行,可以用这个改进版:
awk -F'\t' '$4 == prev { if (!printed_prev) { print prev_line printed_prev = 1 } print $0 } $4 != prev { printed_prev = 0 } {prev = $4; prev_line = $0}' input.tsv
这个版本会标记是否已经打印过上一行,避免重复输出中间行。
测试你的示例输入
把你提供的输入保存为input.tsv,运行第一个命令后,就能得到你期望的输出:
line 4 2 var281 90 line 5 2 var281 91 line 8 3 var99 14 line 9 3 var99 19
内容的提问来源于stack exchange,提问作者user9861194
相关产品推荐
相关产品推荐

