我正在尝试匹配包含 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}'