我正在尝试在脚本中解释awk命令。该命令包含一个变量,其中包含文件中的正常字段数,我想摆脱与此数量的字段不匹配的行。
这是我的代码:
filename='myfile.txt'
nbfields=$(head -1 $filename | awk -F '|' '{print NF}')
awkcommand="awk -F '|' 'NF=="$nbfields"{print \$0}'"
$awkcommand > 'myotherfile.txt'
执行时,我收到错误:
awk: cmd. line:1: 'NF==3{print
awk: cmd. line:1: ^ invalid char ''' in expression
我在\
之前使用$0
进行了尝试,但是它是相同的。
我可以通过使用eval使其工作,但我想尽可能避免使用eval。据我了解,使用它是危险的。有什么方法可以避免吗?
答案 0 :(得分:2)
您不需要head
,您可以这样做:
nbfields=$(awk -F '|' '{print NF;exit}' file)
最好使用函数来存储awk命令:
awkcommand() { awk -F '|' -v n=$nbfields 'NF==n' file; }
另请注意使用-v
选项将shell变量传递给awk的正确方法。
答案 1 :(得分:1)
根据我的理解,您希望根据第一行计算字段数,然后打印文件中具有相同字段数的所有行。正确的吗?
你可以这样做 -
awk -F'|' 'BEGIN{i=0}{if(i==0){fields=NF;i=1} if (fields==NF) print $0;}'