在具有相同扩展名的文件集上应用AWK
-
05-07-2019 - |
题
我想应用以下“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脚本和文件名,但不会运行它。
不隶属于 StackOverflow