Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在awk中打印文件名?_Bash_Awk - Fatal编程技术网

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

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

我想打印文件名,然后在循环中打印$7的值。请问怎么了?使用
“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
如果您有GNU
awk
,您可以使用
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