如何让AWK程序读取字段名列表并检查文件是否包含对应字段?
问题分析与解决
原命令的错误点
- 仅处理单个字段:BEGIN块里的
getline fieldname只读取了field-names.txt的第一行,后续字段完全没处理,无法实现遍历所有字段的需求。 - 正则匹配错误:
$0 ~ /fieldname/是匹配字符串"fieldname",而非变量fieldname的实际值,根本不会匹配目标字段。 - 输入逻辑混乱:同时通过管道传入
field-names.txt和指定**/*.TXT作为输入文件,awk会先处理管道内容,再处理TXT文件,逻辑完全错位。
正确实现方式
方式一:用awk一次性处理所有字段与文件
该方法将字段存入数组,再遍历每个TXT文件的首行进行匹配,输出每个字段对应的文件:
awk ' # 读取field-names.txt的所有字段,存入数组 FNR == NR { fields[$1] = 1; next } # 处理每个TXT文件的首行 FNR == 1 { # 遍历所有字段,用边界匹配确保字段是独立项(避免部分匹配,比如ALT被ALT1_DESC误匹配) for (field in fields) { if ($0 ~ "(^| )" field "( |$)") { print field ": " FILENAME } } } ' field-names.txt **/*.TXT
方式二:用shell循环逐字段查找
逐行读取字段,对每个字段检查所有TXT文件的首行是否包含该字段:
while read -r field; do echo "字段 $field 对应的文件:" # 遍历所有TXT文件,仅检查首行 for file in **/*.TXT; do head -1 "$file" | grep -q "\<$field\>" && echo "$file" done done < field-names.txt
说明:
\<$field\>用于匹配独立的字段,避免出现字段被其他长字段包含的误匹配(比如ALT不会被ALT1_DESC匹配到)。
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

