awk 匹配字符串并求和列值

awk 匹配字符串并求和列值

我正在尝试匹配包含 5 个 csv 文件的文件夹中的单词United States,但是,我使用的命令会检查该行中是否有单个出现的情况。我还想根据匹配的字符串对其他两列求和。

awk -F "," '{if (/United States/) sum_1 += $2;sum_2 += $3} END {print sum_1, sum_2}' Files/*.csv

是的,我正在尝试检查 行中不止一次出现的情况awk

因此,如果该行出现两次 United States,则应给出:

2
awk '/United States/{x++;}END{print x}' Files/*csv

示例文件

United States,1,2,3
Donald TRump,1,2,3
United States,1,2,3,United States

答案1

awk '/United States/ {i++} END {print i}' RS=",|\n" Files/*.csv

RS- 输入记录分隔符,默认为换行符。

答案2

awk

您可以使用字符串函数格子,它返回每行进行的替换数。这是计算每行出现次数的便捷方法,并且您可以对所有行执行此操作,因此您可以对所有行进行计数。

awk '{cnt += gsub(/United States/,"&")} END {print cnt}' *.csv

如果您想在 awk 脚本中使用此检查(如您的示例中所示),您可以使用如下语法:

awk '{ if (gsub(/pattern/"&")) {"do stuff here"} }' file

或者

awk '{x = gsub(/pattern/"&"); "do stuff with x here"; }' file

grep

同样使用grep, with-o我们将在输出中得到每场比赛一行,输出行的计数就是结果。

grep -o "United States" *.csv | wc -l

答案3

鉴于您提供的示例输入文件,@nezabudka 的答案:

awk 'BEGIN {RS=",|\n"} /United States/ {i++} END {print i}' inputFile

似乎是正确的。这促使我问您:您确定您的示例输入文件代表所有字段分隔符吗?如果没有,这里有一个替代解决方案,它允许输入文件情况,例如:

> cat inputFile
United States,1,2,3
Donald TRump,1,2,3 United States blih blah \!?# bluh  United States
United States,1,2,3,United    States

> awk 'BEGIN {RS=",|\n| "} 
       /United/ {rec=NR; next} 
       /States/ && NR==rec+1 {i++} 
       END {print i}'  inputFile
5

答案4

命令

    #/bin/bash

    awk '{print gsub("United States",$0)}' filename| awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'

相关内容