使用bash从文件中读取数据并使用awk获取某些列的总和
假设我想通过一个.txt文件收集一些统计信息,该文件如下所示:使用bash从文件中读取数据并使用awk获取某些列的总和,bash,unix,awk,Bash,Unix,Awk,假设我想通过一个.txt文件收集一些统计信息,该文件如下所示: misses 15 hit 18 misses 20 hit 31 我编写了一个bash脚本,只打印每一行: #!/bin/bash while read line do echo $line done <t.txt 我已经搜索过了,这可以用awk完成。 您能用awk帮助完成这项工作吗?只需将您的算法转换为bash: #!/bin/bash while read
misses 15
hit 18
misses 20
hit 31
我编写了一个bash脚本,只打印每一行:
#!/bin/bash
while read line
do
echo $line
done <t.txt
我已经搜索过了,这可以用awk完成。
您能用awk帮助完成这项工作吗?只需将您的算法转换为bash:
#!/bin/bash
while read what count ; do
case $what in
(hit) let total_h+=count ;;
(misses) let total_m+=count ;;
(*) echo Invalid input >&2; exit ;;
esac
done < t.txt
echo Hits: $total_h, Misses: $total_m
#/bin/bash
读什么算什么;做
案例$what in
(hit)让total_h+=计数;;
(未命中)让total_m+=计数;;
(*)回显无效输入>&2;出口
以撒
完成
只需将您的算法转换为bash:
#!/bin/bash
while read what count ; do
case $what in
(hit) let total_h+=count ;;
(misses) let total_m+=count ;;
(*) echo Invalid input >&2; exit ;;
esac
done < t.txt
echo Hits: $total_h, Misses: $total_m
#/bin/bash
读什么算什么;做
案例$what in
(hit)让total_h+=计数;;
(未命中)让total_m+=计数;;
(*)回显无效输入>&2;出口
以撒
完成
不需要任何bash gubbins,awk将完成所有工作
awk 'BEGIN{ hits=0; misses=0; }/^hit/{ hits+=$NF}; /^misses/{misses=$NF}; END {print "Hits: " hits "\nMisses: " misses }' txtfile
确定此一衬套的3个零件:
BEGIN{ hits=0; misses=0; }
仅在awk从txtfile读取任何行并初始化两个变量hits和misses之前运行一次
/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
在每行上运行,如果该行以hits开头,则最后一列将添加到hits变量,如果该行以misses开头,则misses变量将最后一列添加到该行
END {print "Hits: " hits "\nMisses: " misses' }
只在处理完所有行后运行,并打印出一条详细说明命中和未命中的消息。不需要任何bash gubbins,awk将完成所有操作
awk 'BEGIN{ hits=0; misses=0; }/^hit/{ hits+=$NF}; /^misses/{misses=$NF}; END {print "Hits: " hits "\nMisses: " misses }' txtfile
/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
确定此一衬套的3个零件:
BEGIN{ hits=0; misses=0; }
仅在awk从txtfile读取任何行并初始化两个变量hits和misses之前运行一次
/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
在每行上运行,如果该行以hits开头,则最后一列将添加到hits变量,如果该行以misses开头,则misses变量将最后一列添加到该行
END {print "Hits: " hits "\nMisses: " misses' }
仅在处理完所有行后运行,并打印出详细说明命中和未命中的消息
/^hits/{ hits+=$NF}; /^misses/{misses=$NF};
awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' your_file
测试:
> cat temp
misses 15
hit 18
misses 20
hit 31
hait 31
> awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' temp
total hits 49 ,and total misses 35
测试:
> cat temp
misses 15
hit 18
misses 20
hit 31
hait 31
> awk '/misses/||/hit/{a[$1]+=$2}END{print "total hits",a["hit"],",and total misses",a["misses"]}' temp
total hits 49 ,and total misses 35
declare misses=0 hit=0
读取var-val时;做
让$var+=val
完成
声明未命中=0命中=0
读取var-val时;做
让$var+=val
完成
请展示您尝试过的内容。@chepner我已经把我的脚本放在这里了。只是读每一行。忘记关于awk的事情吧,终端中没有打印任何内容。在awk
中,这很容易做到。如果您让我们看看您是如何尝试解决问题的,那么您将了解更多信息,这样我们就可以向您展示如何解决问题,而不仅仅是为您编写程序。请展示您已经尝试过的内容。@chepner我已经把我的脚本放在这里了。只是读每一行。忘记关于awk的事情吧,终端中没有打印任何内容。在awk
中,这很容易做到。如果您让我们看看您是如何尝试解决问题的,那么我们可以向您展示如何解决问题,而不仅仅是为您编写程序,您将了解更多。