awk不同文件的总和结果保存在不同文件中

时间:2019-03-19 23:09:41

标签: awk

为简化起见,此命令是否可以在每个目录中创建一个文件,其中包含*traffic*个文件的总和。

命令:

find /config -maxdepth 2 -name "*traffic*" -exec awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum > "xx.txt"}' {} +

我不知道如何为每个用户awk保存文件,因为我不仅有/config/mark/,而且还有config/john/config/mary,所以继续,不知道如何将文件保存在该目录中。

因此,预期的输出将是每个文件夹中的一个xx.txt文件,其中仅包含当前文件夹中的*traffic*个文件,因此/config/mark/应该具有导出到的所有*traffic*个文件的总和xx.txt/config/john应该具有相同的内容,但仅包含/config/john文件夹中的总和。

样本输入是00002 0000000000 0000051327 #test放在一个文件中,并且在类似目录/config/mike/traffic1.txt/config/mike/traffic2.txt的目录中还有另一个与此值00002 0000000000 0000331327 #test类似的文件,并且输出应该只是文件的总和

我已经设法通过我能找到的来做到这一点,但是它是一个一个地添加文件,我需要它来将所有文件添加到工作目录中并求和。

find /config -name '*traffic*' -printf "$PWD:%p\n" | while IFS=":" read FPATH FNAME
do
        echo "FNAME = $FNAME"
        echo "FPATH = $FPATH"
        echo ""
        awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum >> "'$FNAME'xxxx"}' "$FNAME"
done

2 个答案:

答案 0 :(得分:1)

好吧,我设法自己找到了一个解决方案,似乎$ PWD没有用,所以我改用%h这样的最终代码,假设我们在某些子文件夹中有一个包含 traffic 文件的文件夹配置/ config中,您要将流量文件中的数字添加到名为result.txt的文件中

这是代码:

 find /config -name '*traffic*' -printf "%h:%p\n" | while IFS=":" read FPATH FNAME
do
    awk 'BEGIN {sum=0} {for(i=1; i<=NF; i++) sum+=$i } END {print sum >> "'$FPATH/'result.txt"}' $FNAME
done 

它将在每个发现流量文件的文件夹中创建一个result.txt

答案 1 :(得分:0)

使用GNU awk编写ENDFILE,gensub()和多字符RS(未经测试):

find /config -name '*traffic*' -exec \
awk -v RS='[[:space:]]+' '{sum+=$0} ENDFILE{print sum+0 >> gensub("[^/]+$","xx.txt",1,FILENAME); sum=0}' {} +

或:

find /config -type d -maxdepth 2 |
while IFS= read -r dir; do
    awk -v RS='[[:space:]]+' '{sum+=$0} ENDFILE{print sum+0; sum=0}' "$dir"/*traffic* > "$dir"/xx.txt
done