Shell脚本:我怎么才能得到第二个元素由逗号分隔

jq6vz3qz  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(175)

如何计算第二个值的出现次数,例如:“Rv1408”?我想获取并计算每行中第二个元素的出现总数。<.br>
file.txt:

Rv0729,Rv1408,Rv1408  
Rv0162c,Rv0761,Rv1862,Rv3086  
Rv2790c,Rv1408
Rv2fd90c,Rv1408
Rv1862,Rv3086
Rvsf62,Rv3086

我尝试(不工作)输入:

awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' m.txt | sort | cut --delimiter=',' --fields=1

预期输出:

total no of occurences: 
Rv1408: 3
Rv0761:1
Rv3086: 2

idk为什么即使i type fields=2,i也无法获得第二个元素

rekjcdws

rekjcdws1#

您可以通过传递-F逗号字段分隔符来简化此操作。
就像这样:

awk -F, '{map[$2]++} END { for (key in map) { print key, map[key] } }' file.txt
tag5nh1u

tag5nh1u2#

idk为什么即使i type fields=2,i也无法获得第二个元素
当你提供一个以上的参数给print时,GNU AWK确实使用 * 输出字段分隔符 *(OFS)来连接这些参数,默认情况下是空格,但是你通知cut它应该将,作为分隔符。
如果您必须使用awk输出(通过管道传输到cut),请确保awk的输出字段分隔符与cut的分隔符相同,您基本上有三种选择:

awk 'BEGIN{OFS=","}END{print 11,22,33}' emptyfile.txt | cut --delimiter=',' --fields=2
awk 'END{print 11,22,33}' emptyfile.txt | cut --delimiter=' ' --fields=2
awk 'BEGIN{OFS="\t"}END{print 11,22,33}' emptyfile.txt | cut --fields=2

它们都给予相同输出

22

说明:第一个选项是在两个命令中将OFS--delimiter显式设置为相同的字符(示例中为,),第二个选项是将--delimiter设置为默认值OFS,即空格,第三个选项是将OFS设置为默认值--delimiter,即制表符。

警告在大多数情况下,不需要将awk输出通过管道传输到cut,因为任务可能完全在awk中完成

相关问题