Awk脚本无输出排查:检测表格1-4列匹配时第6列一致性
问题:定位表格中不符合规则的行
原始数据
1,879468,944088,A,C,K,Q,0.159,ENST00000342066 1,879468,944088,A,G,K,E,0.160,ENST00000342066 1,879469,944089,A,C,K,T,0.185,ENST00000342066 1,879469,944089,A,C,Q,T,0.185,ENST00000342066
需求说明
当任意两行的第1、2、3、4列数值完全相同时,第6列的数值必须保持一致。例如上述数据中,最后两行的第1-4列均为1,879469,944089,A,但第6列分别是K和Q,属于不符合规则的情况。
原脚本无输出的可能原因
- 数据文件使用Windows换行符(
\r\n),导致生成的key包含隐藏的\r字符,视觉上相同的key实际不匹配 - 脚本的流式处理逻辑仅能检测后续行与第一个匹配行的冲突,若存在更早的冲突行无法被识别
- 脚本执行时指定的文件路径或名称错误(比如
my_table.txt不存在或路径有误)
修正后的脚本
以下脚本先收集所有相同key对应的第6列值和行号,再统一检查所有冲突,同时避免了换行符干扰:
awk -F ',' '{ # 用竖线分隔生成唯一key,规避逗号带来的匹配问题 key = $1 "|" $2 "|" $3 "|" $4; # 记录每个key对应的所有第6列值和行号 val_list[key] = val_list[key] " " $6; line_list[key] = line_list[key] " " NR; } END { # 遍历所有已记录的key for (key in val_list) { split(val_list[key], vals); split(line_list[key], lines); # 以第一个值作为基准值 base_val = vals[1]; base_line = lines[1]; # 检查后续所有值是否与基准一致 for (i=2; i<=length(vals); i++) { if (vals[i] != base_val) { print "发现不匹配:"; print " Key: " key; print " 行" base_line "的值:" base_val; print " 行" lines[i] "的值:" vals[i]; print "------------------------"; } } } }' my_table.txt
额外排查步骤
- 确认文件存在:运行
ls my_table.txt检查文件路径是否正确 - 转换文件换行符为Unix格式:
dos2unix my_table.txt - 验证列数正确性:运行
awk -F ',' '{print NF}' my_table.txt确保每行都是9列
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

