在bash脚本中解释awk命令

时间:2014-12-12 07:36:47

标签: bash awk

我正在尝试在脚本中解释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。据我了解,使用它是危险的。有什么方法可以避免吗?

2 个答案:

答案 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;}'