如何用Bash逐行比较文件中每行的第三列内容?
没问题,我来帮你搞定这个需求!要实现逐行对比文件中每行的第三列与下一行第三列,我们可以用两种实用的方式来做——纯Bash循环或者更高效的awk工具,下面给你详细拆解:
先看我们的示例文件
假设我们的目标文件是names.txt,内容如下:
JOHN SMITH SMITH JIM JOHNSON JOHNSON JIM SMITH SMITH
方法1:纯Bash循环实现(适合小文件)
这个方法用原生Bash命令就能完成,逻辑直观易懂:先读取第一行的第三列作为基准值,然后从第二行开始逐行读取,对比当前行第三列和基准值,相等就执行你需要的操作,不等就更新基准值。
#!/bin/bash # 定义要处理的文件路径 target_file="names.txt" # 读取第一行,忽略前两列,只取第三列作为初始基准值 read -r _ _ prev_column < "$target_file" # 从第二行开始循环处理每一行 tail -n +2 "$target_file" | while read -r _ _ curr_column; do if [ "$curr_column" = "$prev_column" ]; then # 这里替换成你需要执行的操作,比如打印提示、写入日志等 echo "找到连续相等的第三列:$curr_column" # 示例:echo "处理行:$curr_column" >> process.log else # 不相等时,更新基准值为当前行的第三列 prev_column="$curr_column" fi done
小提示:
read -r _ _ prev_column里的_是占位符,用来跳过前两列,只捕获第三列的值;tail -n +2用来从文件第二行开始输出,避免重复处理第一行。
方法2:用awk实现(适合大文件,更高效)
如果你的文件很大,纯Bash循环的速度会比较慢,这时用awk(专门的文本处理工具)会更高效,代码也更简洁:
脚本形式
把下面的代码保存为compare_columns.awk:
#!/usr/bin/awk -f # 处理第一行,记录第三列作为基准值,然后跳过当前行 NR == 1 { prev_col = $3; next } # 从第二行开始处理每一行 { if ($3 == prev_col) { # 这里写你要执行的操作,示例是打印提示 print "连续相等的第三列:" $3 # 要是需要调用shell命令,可以用system(),比如: # system("echo '处理相等列' >> operation.log") } # 不管相等与否,都更新基准值为当前行的第三列 prev_col = $3 }
然后执行脚本:
awk -f compare_columns.awk names.txt
一行命令形式
如果不想写脚本,也可以直接用一行命令搞定:
awk 'NR==1{prev=$3;next} $3==prev{print "连续相等:"$3} {prev=$3}' names.txt
内容的提问来源于stack exchange,提问作者Gabi
相关产品推荐
相关产品推荐

