在awk中使用变量引用字段内容时脚本失效的问题排查
问题排查与修复
核心错误原因
你的脚本里awk的判断逻辑完全错误:
原代码中var ~ /@/是在检查变量var本身(也就是15、16这类数字)是否包含@符号,这显然永远不会成立,所以没有任何输出写入目标文件。
正确的逻辑应该是检查第var个字段是否包含@,在awk中,第N个字段的写法是$N,所以判断条件应该改为$var ~ /@/。
基础修复版本
先修正判断逻辑,同时去掉冗余的while read+echo(awk本身可以直接读取文件,不需要逐行传递):
for (( c=15; c<=60; c++ )) do awk -v var="$c" -F, '$var ~ /@/ {print $0}' asia.csv >> "$c.csv" done
性能优化版本
原脚本会循环46次,每次都重新读取一遍asia.csv,效率极低。可以用awk一次性完成所有字段的检查,只读取一次文件:
awk -F, '{ # 遍历15到60的字段编号 for (field=15; field<=60; field++) { # 如果当前字段包含@,就将整行写入对应编号的csv if ($field ~ /@/) { print $0 >> field ".csv" } } }' asia.csv
额外注意事项
- 如果你的csv字段中包含逗号(比如带引号的字段),单纯用
-F,分割会出错,这种情况需要用支持csv解析的工具或者更复杂的awk正则来处理字段分割。 - 写入文件时建议用
>>追加,避免每次循环覆盖之前的内容(你的原脚本已经做到了这一点)。
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

