Awk 基于bash中的两列计算唯一值的数量

Awk 基于bash中的两列计算唯一值的数量,awk,cut,uniq,Awk,Cut,Uniq,我有一个选项卡分隔的文件,如下所示: A 1234 A 123245 A 4546 A 1234 B 24234 B 4545 C 1234 C 1234 Output: A 3 B 2 C 1 基本上,我需要属于第一列的唯一值的计数,所有这些都在一个带有管道的突击队中。正如您可能看到的,可能会有一些类似1234的副本。我对awk或cut有一些想法,但这两个似乎都不起作用。他们只是打印出所有的唯一对,而我需要计算第二列中的唯一值,并考虑第一列中的值 awk -F " "'{print $1

我有一个选项卡分隔的文件,如下所示:

A 1234
A 123245
A 4546
A 1234
B 24234
B 4545
C 1234
C 1234

Output: 
A 3
B 2
C 1
基本上,我需要属于第一列的唯一值的计数,所有这些都在一个带有管道的突击队中。正如您可能看到的,可能会有一些类似1234的副本。我对awk或cut有一些想法,但这两个似乎都不起作用。他们只是打印出所有的唯一对,而我需要计算第二列中的唯一值,并考虑第一列中的值

awk -F " "'{print $1}' file.tsv | uniq -c
cut -d' ' -f1,2 file.tsv | sort | uniq -ci
我真的很感激你的帮助!先谢谢你

如果您有完整的awk解决方案,请尝试以下内容

awk 'BEGIN{FS=OFS="\t"} !found[$0]++{val[$1]++} END{for(i in val){print i,val[i]}}' Input_file
说明:增加对以上内容的详细说明

awk '                  ##Starting awk program from here.
BEGIN{
  FS=OFS="\t"
}
!found[$0]++{       ##Checking condition if 1st and 2nd column is NOT present in found array then do following.
  val[$1]++            ##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.
如果您有完整的awk解决方案,请尝试以下内容

awk 'BEGIN{FS=OFS="\t"} !found[$0]++{val[$1]++} END{for(i in val){print i,val[i]}}' Input_file
说明:增加对以上内容的详细说明

awk '                  ##Starting awk program from here.
BEGIN{
  FS=OFS="\t"
}
!found[$0]++{       ##Checking condition if 1st and 2nd column is NOT present in found array then do following.
  val[$1]++            ##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 $1}' | uniq -c | awk '{print $2 " " $1}'
它适用于你的例子。但我不确定它是否适用于其他情况。如果不行就告诉我

您可以尝试以下方法:

cat file.tsv | sort | uniq | awk '{print $1}' | uniq -c | awk '{print $2 " " $1}'
它适用于你的例子。但我不确定它是否适用于其他情况。如果不行就告诉我

使用GNU awk:

$ gawk -F\\t '{a[$1][$2]}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[$1][$2]                  # 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
使用GNU awk:

$ gawk -F\\t '{a[$1][$2]}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[$1][$2]                  # 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

另一种方法是使用handy实用程序:


要求输入文件按第一列排序,如示例。如果real file不是,请将-s添加到选项中。

另一种方法,使用便捷实用程序:


要求输入文件按第一列排序,如示例。如果实际文件不是,请在选项中添加-s。

sort+uniq,然后为什么要使用cut-d“”,即当文件被制表符分隔时,告诉cut使用空格而不是制表符作为分隔符?sort+uniq,然后为什么要使用cut-d“”,即当文件被制表符分隔时,告诉cut使用空格而不是制表符作为分隔符?谢谢,但我还是得到了类似的东西:1234 2//123245 1//A 4546 1等@ta4le,通过给出的示例对我来说效果很好,您能告诉我您的实际输入文件是否与所示示例相同吗?@ta4le,您的输入文件是逗号分隔的吗?请确认一下。不,它更复杂,但语义是相同的:两列,键和多个值。Tab separate我建议使用find[$0]而不是find[$1,$2]谢谢,但我还是得到了类似的东西:1234 2//123245 1//A 4546 1等@ta4le,使用给定的示例对我来说效果很好,你能告诉我你的实际输入文件是否与显示的示例相同吗?@ta4le,你的输入文件是逗号分隔的吗?请确认一下。不,它更复杂,但语义是相同的:两列,键和多个值。制表符分隔我建议使用已找到的[$0]而不是已找到的[$1,$2]