AWK匹配正则时替换指定列并保留未修改行的实现问题
解决AWK中替换指定列空格为下划线并保留所有行的问题
我明白你的需求:要把指定位置的列(比如第9、10列的LA和CROIX-HELLEAN)用下划线连接,同时保留所有未修改的行。你的原命令之所以只保留了修改的行,是因为逻辑里对未匹配条件的行做了不必要的字段截断,导致输出异常。
这里给你两个方案,分别对应你的具体场景和更通用的需求:
针对你的具体场景(仅第9列为"LA"时合并第9、10列)
这个命令会精准处理目标行,同时原封不动保留所有其他行:
awk '{ # 只处理第9列是"LA"的行 if ($9 == "LA") { # 将第9列替换为LA_后面的字段 $9 = $9 "_" $10 # 把第10列之后的字段依次前移一位,删除原第10列 for (i = 10; i < NF; i++) { $i = $(i + 1) } # 减少字段数,确保格式正确 NF-- } # 不管有没有修改,都输出整行 print $0 }' file.txt > newfile.txt
更通用的场景(合并第9列及之后的所有字段为下划线连接)
如果你的需求是把第9列开始的所有字段都合并成一个带下划线的字段(不管第9列内容是什么),可以用这个命令:
awk '{ if (NF >= 9) { # 初始化合并后的字段为第9列 merged = $9 # 遍历第10列到最后一列,逐个拼接下划线 for (i = 10; i <= NF; i++) { merged = merged "_" $i } # 把第9列替换为合并后的内容 $9 = merged # 把字段数设置为9,截断后面的多余字段 NF = 9 } # 输出所有行 print $0 }' file.txt > newfile.txt
为什么你的原命令出问题了?
你的原命令里,不管是否匹配$9=="LA"的条件,都会执行NF=j-1。当条件不满足时,j还是初始值9,NF=8会把原行的字段截断到前8列,导致这些行的内容被破坏,看起来像是没保留。而上面的方案只会在需要修改时调整字段,其他行完全原样输出。
内容的提问来源于stack exchange,提问作者Cha.B
相关产品推荐
相关产品推荐

