You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:44:27