在linux中唯一列并获取频率

在linux中唯一列并获取频率,linux,bash,unique,Linux,Bash,Unique,我有一个data.txt,其矩阵结构为4 X 9: 101000110 000000010 001010010 100101101 我想计算唯一列的频率,预期结果是: 1001 2 0000 1 1010 1 0001 3 0010 1 1110 1 我在互联网上使用awk只能根据特定的栏目找到唯一的行,我是否需要首先转换我的数据来解决这个问题。我想知道是否有更直接的方法来解决这个问题?谢谢。您不需要转置它。使用awk在空字段分隔符上拆分,并将每个值追加到按列编号索引的数组中。在结束块中,

我有一个data.txt,其矩阵结构为4 X 9:

101000110
000000010
001010010
100101101
我想计算唯一列的频率,预期结果是:

1001 2
0000 1
1010 1
0001 3 
0010 1
1110 1

我在互联网上使用awk只能根据特定的栏目找到唯一的行,我是否需要首先转换我的数据来解决这个问题。我想知道是否有更直接的方法来解决这个问题?谢谢。

您不需要转置它。使用awk在空字段分隔符上拆分,并将每个值追加到按列编号索引的数组中。在结束块中,计算频率并打印:

awk 'BEGIN{FS=""} {
   for (i=1; i<=NF; i++)
      a[i] = a[i] $i
}
END {
   for (i=1; i<=length(a); i++)
      freq[a[i]]++

   for(i in freq)
      print i, freq[i]
}' file

0000 1
0010 1
0001 3
1001 2
1010 1
1110 1
救援人员:

perl -aF// -lne '$s[$_] .= $F[$_] for 0 .. $#F;
                 }{
                 $c{$_}++ for @s;
                 print "$_\t$c{$_}" for keys %c' < data.txt
-n逐行读取输入 -我负责换行 aF//按字符将每行拆分为@F数组 @s累积特定列中的字符 最后,使用哈希表%c对频率进行计数。 此awk将有助于:

awk '{for (i=1;i<=NF;i++){
         a[i]=a[i]""$i
       }
     }
     END{
     for (i=1;i<=9;i++) {
       res[a[i]]++
       }
     for (r in res){
         print r, res[r] 
       }
     }' FS= yourfile
解释


只需显示最终结果。

尽管不需要,但这里有一个使用unix工具集的传输和计数解决方案

$ sed 's/./&\n/g' file | 
  sed '/^$/d'          | 
  pr -4ts' '           | 
  tr -d ' '            | 
  sort                 | 
  uniq -c              | 
  awk '{print $2,$1}'

0000 1
0001 3
0010 1
1001 2
1010 1
1110 1

列是如何定义的?@OlafDietsche第一列是1001,第二列是0000,第三列是1010,。。。。。。data.txt文件中有9列
for (i=1;i<=NF;i++){
         a[i]=a[i]""$i
       }
     }
 for (i=1;i<=9;i++) {
   res[a[i]]++
   }
 for (r in res){
     print r, res[r] 
   }
$ sed 's/./&\n/g' file | 
  sed '/^$/d'          | 
  pr -4ts' '           | 
  tr -d ' '            | 
  sort                 | 
  uniq -c              | 
  awk '{print $2,$1}'

0000 1
0001 3
0010 1
1001 2
1010 1
1110 1