Bash 如何在awk中打印文件名?
我想打印文件名,然后在循环中打印$7的值。请问怎么了?使用Bash 如何在awk中打印文件名?,bash,awk,Bash,Awk,我想打印文件名,然后在循环中打印$7的值。请问怎么了?使用“i” 通知后输出 fdfadfasdfa 0.00775 0.00644 6298 dsafdsfsaf 0.00705 0.00574 14173 dasfdsafdafd 0.00716 0.00597 2294
“i”
通知后输出
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
因为您依赖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
你能试试下面的吗。您不需要对其使用
循环
awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7}' r* | column -t > out
如果您有GNUawk
,您可以使用nextfile
保存许多循环,并在满足以下条件后直接跳转到下一个文件:
awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7; nextfile}' r* | column -t > out
将\t\t
设置为BEGIN
部分中输出集OFS
的制表符分隔符。在输出中添加|列-t
,以获得正确的选项卡格式
删除BEGIN{OFS=“\t\t”}
,以防由于添加了列
命令(OP要求在输出中添加制表符,以便添加该制表符)。谢谢,为什么文件名的forst列没有不同?我在所有行上都有相同的文件see@RavinderSingh13的答案。
awk 'BEGIN{OFS="\t\t"} FNR==2{print FILENAME, $7; nextfile}' r* | column -t > out