如何在awk中打​​印文件名?

时间:2019-10-14 03:00:01

标签: bash awk

我想在循环中打印文件名,然后打印$ 7的值。请问出什么事了?与'"i"'

for i in r*; do
    awk 'FNR == 2 {print '"i"', $7}' r* > out
done

建议后输出

fdfadfasdfa     0.00775                 0.00644                 6298
dsafdsfsaf      0.00705                 0.00574                 14173
dasfdsafdafd        0.00716                 0.00597                 22948
dafadsafdafsdf      0.00859                 0.00679                 5210
dafadsfsa       0.00705                 0.00576                 11098

2 个答案:

答案 0 :(得分:3)

能否请您尝试以下。您无需为此使用main循环。

for

如果您有GNU awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7}' r* | column -t > out ,则可以使用awk保存多个周期,并在条件满足时直接跳转到下一个文件,例如:

nextfile

要将awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7; nextfile}' r* | column -t > out 设置为\t\t部分中输出集OFS的制表符分隔符。在输出中添加BEGIN,以获得正确的TAB格式。

如果由于添加了| column -t命令而不需要BEGIN{OFS="\t\t"},则删除column(OP在输出中要求TAB,因此已添加了它)。

答案 1 :(得分:2)

由于您要依靠bash来提供$i,因此需要添加一个美元符号。同样,单引号和双引号也应互换。 Awk需要看到双引号,因此它们必须位于单引号之内。

for i in r*; do
    awk 'FNR == 2 {print "'$i'", $7}' r* > out
done

请注意,如果$i可能包含特殊字符,这是不安全的。最好不要在awk脚本中直接扩展bash变量。您会遇到引用问题,空格问题;这是一个定时炸弹。

最好使用-v将bash变量传递给awk。它更安全,并且避免了引导时引号和转义的问题。您只需编写i,就这么简单。

for i in r*; do
    awk -v i="$i" 'FNR == 2 {print i, $7}' r* > out
done