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

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

会起作用。

有帮助吗?

解决方案

一旦你删除了回声,它应该可以工作:

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 ):

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 

你需要添加';' :

for i in *.txt; do ...

而不是

for i in *.txt do ...

不需要回声。

尝试

表示我在* .txt;做; awk'$ 4~ / NM / {sum + = $ 2} END {print sum}'$ i;完成

表示我在* .txt;做awk'$ 4~ / NM / {sum + = $ 2} END {print sum}'$ i;完成

应该有效

不确定你是否复制了粘贴或者是一个错字。

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

修正了echo后,上面的命令将回显你的awk脚本和文件名,但不会运行它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top