GAWK/AWK中字段与变量模式匹配失效问题排查
问题解决:UTF-16编码导致AWK字段匹配失败
我尝试提取文件中第13个字段匹配39905或19043的行,执行了以下命令:
head input.dat | awk -F '|' -v CODE="39905|19043" '{print $13; if($13~CODE){print "Matched"} else {print "Nomatch"} }'
执行后发现,明明存在符合匹配条件的字段值,但所有结果都返回Nomatch。
原因分析
通过十六进制分析确认,输入文件input.dat采用UTF-16 LE编码,而AWK默认处理UTF-8编码文本。UTF-16编码的ASCII字符会携带额外空字节(比如字符3在UTF-16 LE中是0x33 0x00),导致AWK读取的第13个字段包含不可见冗余字节,无法与纯ASCII模式字符串匹配。
解决方法
先用iconv将UTF-16 LE编码转成UTF-8,再执行AWK命令:
head input.dat | iconv -f UTF-16LE -t UTF-8 | awk -F '|' -v CODE="39905|19043" '{print $13; if($13~CODE){print "Matched"} else {print "Nomatch"} }'
转码后字段内容恢复为正常文本,AWK即可正确匹配指定模式。
内容的提问来源于stack exchange,提问作者user5336
相关产品推荐
相关产品推荐

