在linux中唯一列并获取频率
我有一个data.txt,其矩阵结构为4 X 9:在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在空字段分隔符上拆分,并将每个值追加到按列编号索引的数组中。在结束块中,
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