0

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

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

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

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

会工作。

4

6 回答 6

4

删除回声后,它应该可以工作:

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 }' {} \;

(基本上 make find 直接执行 awk ,所以也打印出文件名。

于 2009-03-09T09:47:21.080 回答
3
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done

这将打印已处理文件的名称以及awk命令的输出。

于 2009-03-09T10:06:01.753 回答
2

试试这个(在Solaris上使用nawk/usr/xpg4/bin/awk):

awk 'END {
  printf "%s: %.2f\n", fn, sum
  }
FNR == 1 {
  if (fn) printf "%s: %.2f\n", fn, sum
  fn = FILENAME
  sum = 0
  }
$4 ~ /NM/ { 
  sum += $2 
  }' *.txt 
于 2009-03-09T11:09:46.640 回答
2

您需要添加一个';' :

for i in *.txt; do ...

代替

for i in *.txt do ...
于 2009-03-09T14:29:38.607 回答
1

不需要回声。

尝试

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

或者

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

应该管用

于 2009-03-09T09:46:24.763 回答
0

不知道你是复制粘贴还是打错了。

for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; 完毕

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

于 2009-03-09T09:43:50.840 回答