根据 bash 中的两列计算唯一值的数量
Counting the number of unique values based on two columns in bash
我有一个制表符分隔的文件,如下所示:
A 1234
A 123245
A 4546
A 1234
B 24234
B 4545
C 1234
C 1234
Output:
A 3
B 2
C 1
基本上,我需要对属于第一列的唯一值进行计数,所有这些都在一个带有管道的突击队中。如您所见,可能会有一些重复项,例如 "A 1234"。我对 awk 或 cut 有一些想法,但似乎都不起作用。他们只是打印出所有唯一对,而考虑到第一列中的值,我需要第二列中的 count 个唯一值。
awk -F " "'{print }' file.tsv | uniq -c
cut -d' ' -f1,2 file.tsv | sort | uniq -ci
非常感谢您的帮助!先感谢您。
有了完整的 awk
解决方案,请您尝试以下。
awk 'BEGIN{FS=OFS="\t"} !found[[=10=]]++{val[]++} END{for(i in val){print i,val[i]}}' Input_file
说明:为以上添加详细说明。
awk ' ##Starting awk program from here.
BEGIN{
FS=OFS="\t"
}
!found[[=11=]]++{ ##Checking condition if 1st and 2nd column is NOT present in found array then do following.
val[]++ ##Creating val with 1st column inex and keep increasing its value here.
}
END{ ##Starting END block of this progra from here.
for(i in val){ ##Traversing through array val here.
print i,val[i] ##Printing i and value of val with index i here.
}
}
' Input_file ##Mentioning Input_file name here.
你可以试试这个:
cat file.tsv | sort | uniq | awk '{print }' | uniq -c | awk '{print " " }'
它适用于您的示例。 (但我不确定它是否适用于其他情况。如果它不起作用请告诉我!)
使用 GNU awk:
$ gawk -F\t '{a[][]}END{for(i in a)print i,length(a[i])}' file
输出:
A 3
B 2
C 1
解释:
$ gawk -F\t '{ # using GNU awk and tab as delimiter
a[][] # hash to 2D array
}
END {
for(i in a) # for all values in first field
print i,length(a[i]) # output value and the size of related array
}' file
$ sort -u file | cut -f1 | uniq -c
3 A
2 B
1 C
另一种方法,使用方便的 GNU datamash 实用程序:
$ datamash -g1 countunique 2 < input.txt
A 3
B 2
C 1
要求输入文件按第一列排序,就像您的示例一样。如果不是真实文件,请将 -s
添加到选项中。
我有一个制表符分隔的文件,如下所示:
A 1234
A 123245
A 4546
A 1234
B 24234
B 4545
C 1234
C 1234
Output:
A 3
B 2
C 1
基本上,我需要对属于第一列的唯一值进行计数,所有这些都在一个带有管道的突击队中。如您所见,可能会有一些重复项,例如 "A 1234"。我对 awk 或 cut 有一些想法,但似乎都不起作用。他们只是打印出所有唯一对,而考虑到第一列中的值,我需要第二列中的 count 个唯一值。
awk -F " "'{print }' file.tsv | uniq -c
cut -d' ' -f1,2 file.tsv | sort | uniq -ci
非常感谢您的帮助!先感谢您。
有了完整的 awk
解决方案,请您尝试以下。
awk 'BEGIN{FS=OFS="\t"} !found[[=10=]]++{val[]++} END{for(i in val){print i,val[i]}}' Input_file
说明:为以上添加详细说明。
awk ' ##Starting awk program from here.
BEGIN{
FS=OFS="\t"
}
!found[[=11=]]++{ ##Checking condition if 1st and 2nd column is NOT present in found array then do following.
val[]++ ##Creating val with 1st column inex and keep increasing its value here.
}
END{ ##Starting END block of this progra from here.
for(i in val){ ##Traversing through array val here.
print i,val[i] ##Printing i and value of val with index i here.
}
}
' Input_file ##Mentioning Input_file name here.
你可以试试这个:
cat file.tsv | sort | uniq | awk '{print }' | uniq -c | awk '{print " " }'
它适用于您的示例。 (但我不确定它是否适用于其他情况。如果它不起作用请告诉我!)
使用 GNU awk:
$ gawk -F\t '{a[][]}END{for(i in a)print i,length(a[i])}' file
输出:
A 3
B 2
C 1
解释:
$ gawk -F\t '{ # using GNU awk and tab as delimiter
a[][] # hash to 2D array
}
END {
for(i in a) # for all values in first field
print i,length(a[i]) # output value and the size of related array
}' file
$ sort -u file | cut -f1 | uniq -c
3 A
2 B
1 C
另一种方法,使用方便的 GNU datamash 实用程序:
$ datamash -g1 countunique 2 < input.txt
A 3
B 2
C 1
要求输入文件按第一列排序,就像您的示例一样。如果不是真实文件,请将 -s
添加到选项中。