在对文件中的列求和之后打印文件名

时间:2017-07-26 16:10:56

标签: linux bash shell file

我正在使用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

2 个答案:

答案 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