如何使用awk从第二字段匹配模式并输出对应行的第一字段内容
问题解决方案
问题原因分析
- 未指定正确字段分隔符:awk默认按空白字符拆分字段,你的文件是逗号+空格分隔的格式,导致字段拆分完全不符合预期
- 未限定匹配范围:原命令是整行匹配模式,会把第一字段包含
brand A的行也纳入结果,不符合你从第二列开始检索的要求 - 字符串截取逻辑错误:
substr($1, RLENGTH)的用法不符合需求,RLENGTH是上一次正则匹配到的内容长度,会错误截断第一字段的内容
修复后的可用命令
直接运行以下命令即可得到符合预期的结果:
awk -F ", *" '{for(i=2;i<=NF;i++) if($i ~ /brand A/i) {gsub(/\047/,"",$1);print $1;break}}' 0.txt > 1.txt
命令参数解释
-F ", *":指定字段分隔符为逗号加任意数量空格,适配你的文件列分隔格式for(i=2;i<=NF;i++):遍历从第二列开始的所有字段,限定匹配范围$i ~ /brand A/i:对每个字段匹配brand A模式,末尾的i表示忽略大小写,适配你文件中同时存在Brand A和brand A的场景,如果需要严格区分大小写,去掉i即可gsub(/\047/,"",$1):删除第一字段前后的单引号,\047是单引号的ASCII转义写法,避免语法冲突break:匹配到一次就停止遍历当前行剩余字段,提升执行效率
输出验证
执行后1.txt的内容为:
Disinfectants brand B
和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者7beggars_nnnnm
相关产品推荐
相关产品推荐

