我想对扩展名为“*.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
会工作。
我想对扩展名为“*.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
会工作。
删除回声后,它应该可以工作:
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 ,所以也打印出文件名。
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 中的 i;做; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; 完毕
或者
对于 *.txt 中的 i;执行 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; 完毕
应该管用
不知道你是复制粘贴还是打错了。
for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; 完毕
纠正回声后,上面的命令将回显您的 awk 脚本和文件名,但不会运行它。