我有data.txt
矩阵结构(4 X 9):
101000110
000000010
001010010
100101101
我想计算唯一列的频率,预期结果是:
1001 2
0000 1
1010 1
0001 3
0010 1
1110 1
我只能在互联网上使用awk
找到“根据特定列的唯一行”,我是否需要首先转置我的数据来解决此问题。我想知道是否有更直接的方法来解决这个问题?谢谢。
答案 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数组答案 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