我正在使用bash,我有一个目录,其中包含一堆看起来像这样的文件:
Validate
我想创建一个这样的输出:
$ cat myFile.txt
128 foo bar baz
4891 cat dog
36 fish cat
942 potato pants
...
等等。我知道如何使用以下方法对文件求和:
myFile.txt 5194
another.txt 4920
...
但我不知道如何重新打印文件名。特别是,我希望能够在不事先知道文件名的情况下做到这一点,如下所示:
cat myFile.txt | awk '{print $1}' | paste -sd+ - | bc
答案 0 :(得分:1)
您可以使用此for
循环:
for f in *.txt: do
awk '{sum+=$1} END{print FILENAME, sum}' "$f"
done
print
中的 awk
语句将打印输入文件名和总和。
答案 1 :(得分:0)
使用awk
awk 'function p(){if(pf)print pf,s;s=0}FNR==1{p()}{s+=$1;pf=FILENAME}END{p()}' *.txt
更好的可读性
awk '
function p(){
if(pf)print pf,s;
s=0
}
FNR==1{
p()
}
{
s+=$1;
pf=FILENAME
}
END{
p()
}
' *.txt
测试结果
[akshay@localhost tmp]$ ls *.txt
f1.txt f2.txt
[akshay@localhost tmp]$ cat f1.txt
1
2
3
[akshay@localhost tmp]$ cat f2.txt
128
1
2
[akshay@localhost tmp]$ awk 'function p(){if(pf)print pf,s;s=0}FNR==1{p()}{s+=$1; pf=FILENAME}END{p()}' *.txt
f1.txt 6
f2.txt 131