独特的列并获取linux

时间:2016-10-03 15:56:32

标签: 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找到“根据特定列的唯一行”,我是否需要首先转置我的数据来解决此问题。我想知道是否有更直接的方法来解决这个问题?谢谢。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

Perl救援:

perl -aF// -lne '$s[$_] .= $F[$_] for 0 .. $#F;
                 }{
                 $c{$_}++ for @s;
                 print "$_\t$c{$_}" for keys %c' < data.txt
  • -n逐行读取输入行
  • -l处理换行符
  • aF//将每一行按字符分割为@F数组
  • @s累积特定列中的字符
  • 最后,哈希表%c用于计算频率。

答案 2 :(得分:1)

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

<强>结果

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

<强>解释

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] 
   }

只显示最终结果。

答案 3 :(得分:1)

虽然不需要,但这里有一个带有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