Linux 在具有相同扩展名的文件集上应用AWK

Linux 在具有相同扩展名的文件集上应用AWK,linux,bash,unix,awk,file-globs,Linux,Bash,Unix,Awk,File Globs,我想在扩展名为“*.txt”的文件上应用以下“awk”命令 但是为什么这个命令不起作用: for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done 通常情况下 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt 行。不确定您是否粘贴了副本或是打字错误 对于*.txt doecho中的iawk'$4~/NM/{sum+=$2}END{pr

我想在扩展名为“*.txt”的文件上应用以下“awk”命令

但是为什么这个命令不起作用:

for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
通常情况下

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt

行。

不确定您是否粘贴了副本或是打字错误

对于*.txt doecho中的iawk'$4~/NM/{sum+=$2}END{print sum}'$i;完成

更正echo后,上述命令将回显您的awk脚本和文件名,但不会运行它。

echo不是必需的

试一试

对于*.txt中的i;做awk'$4~/NM/{sum+=$2}END{print sum}'$i;完成

对于*.txt中的i;做awk'$4~/NM/{sum+=$2}结束{print sum}'$i;完成


应能工作

一旦移除回音,应能工作:

for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
如果文本文件中有空格,则会失败,您可以尝试以下操作:

find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
打印姓名的替代方法:

find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(基本上是让find直接执行awk,然后打印文件名

for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
这将打印已处理文件的名称以及
awk
命令的输出。

尝试此操作(在Solaris上使用nawk或/usr/xpg4/bin/awk):


您需要添加一个“;”:

for i in *.txt; do ...
而不是

for i in *.txt do ...

非常感谢。有没有一种方法可以同时打印出文件名?在Bash中,*.txt中的'for I'也可以正确地使用空格($I包含包含文件名的整个空格),但您是对的,这会在将$I作为参数传递给awk时产生问题。我现在已经在$I周围添加了所需的引号,谢谢。
for i in *.txt; do ...
for i in *.txt do ...