[英]Awk: Counting fields with a pattern for each line
僅僅因為它的厚臉皮的性質,這讓我感到非常頭疼。
我有一個大約15行的文件(名為“ votes”)。 對於每一行,第一個字段具有候選人的姓名,接下來的15個字段具有15個投票,如下所示:
McBoatface y y n y n y y y n n n y n y
McDoodle n n n n n n n n n n n n n n n
Putin y n y n y y n n n n n n n y y
TheLegend27 y y y y y y y y y y y y y y y
y是,n是否
我編寫了一個awk腳本,該腳本計算每個候選人的“ y”數,並用他/她的名字打印出來:
McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15
這是我的嘗試:
{
count=0;
for(i=$2; i<NF; i++)
{
if ($i == "y") count++;
}
printf("%s %d \n" $1, count);
}
但這只會在名稱后顯示零:
McBoatface 0
McDoodle 0
Putin 0
TheLegend27 0
這是怎么回事? i<NF
表達式錯誤嗎?
另一種方法是在名稱( $1
)之后計算y
,如下所示:
$ awk '{ i=$1; $1=""; print i, gsub(/y/,"") }' file
McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15
解釋:
{
i=$1; # place name to var i
$1=""; # empty name field
print i, gsub(/y/,"") # print name and count of all y's
}
您想要for(i=2; ...
而不是for(i=$2; ...
這是怎么回事,$ 2在任何情況下都不能小於NF,所以您永遠不要進入您的for循環。
而且,您還希望i<=NF
而不是<
,以確保您獲得最后的選票。
$ cat votes.awk
{
count=0;
for(i=2; i<=NF; i++) {
if ($i == "y") count++;
}
print $1, count
}
$ awk -f votes.awk votes.txt
McBoatface 8
McDoodle 0
Putin 6
TheLegend27 15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.