尝试使用 awk 计算并打印歌曲文件名

尝试使用 awk 计算并打印歌曲文件名
RANK  NAME                    BAND  YEAR   GENERE  DOMESTIC/INTERNATIONAL 

206:Reach Out, I'll Be There:The Four Tops:1978:Pop:3/2         
207:Bye Bye Love:The Everly Brothers:1950:Classic:3/2     
208:Gloria:Them:1965:Classic:1/1      
209:In My Room:The Beach Boys:1985:Classic:5/7  
210:96 Tears:? & the Mysterians:1964:Classic:20/15     
211:Caroline, No:The Beach Boys:1975:Classic:5/7   
212:1999:Prince:1958:Classic:5/7       
213:Your Cheatin' Heart:Hank Williams:1988:Soul:7/6       
214:Rockin' in the Free World:Neil Young:1960:Pop:5/7  
215:Sh-Boom:The Chords:1967:Alternative:3/2   
216:Do You Believe in Magic:The Lovin' Spoonful:1988:Classic       
217:Jolene:Dolly Parton:1998:Classic:7/6     
218:Boom Boom:John Lee Hooker:1966:Classic:7/6

1st I tried to print a list of Rank, performers and songs with header so I tried:
but the output still have the default header under the line
nawk  'BEGIN { FS=":" 
printf "%-10s %-35s %-55s\n", "RANK", "PERFORMER","SONG"
print "=====================================================================\n"}
{printf "%-10s %-35s %-55s\n", $1, $3, $2}' songs

我没有统计每种类型的歌曲数量,也没有报告每种类型的总数

所需输出的示例:

经典 10
R&B 5
灵魂 9 等等。

我试过

awk '{count+$5} END {print $5}' 

歌曲,但未能返回结果

答案1

使用起来相当容易awk

$ awk -F: '{count[$5]++}END{for(genre in count) print genre,count[genre]}' file
Soul 1
Classic 9
Pop 2
Alternative 1
  • 我们将行拆分为:看似输入行的分隔符。
  • 类型显示为行中的第 5 个字段
  • 我们将使用类型作为关键字,每次在您的行中看到它时,都会递增
  • END块中,我们将遍历我们的数组并打印键以及我们看到它的时间。

答案2

与 JS 的解决方案原理相同,但可能更容易看出发生了什么,并在必要时进行编辑:

$> cat 文件 | cut -d: -f5 | 排序 | uniq -c
   1 替代方案
   9 经典
   2 流行
   1 灵魂

该任务被分为三个部分 -cut从数据中提取类型列(分隔符:,提取字段 5),sort按字母顺序排列类型,然后uniq -c显示每个条目的计数,而不是显示重复的行。

相关内容