我有一个文件看起来像:
1
2 4 5 6
20
22
24 26 27
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300
我想要一个输出,显示有 4 行 1 列,3 行 4 列,1 行 3 列,1 行 9 列。所以,输出应该是:行(列)
4 (1)
1 (3)
3 (4)
1 (9)
考虑到我的真实数据很大,请问有什么建议吗?同时,我希望最大列数显示在最后一行(此处为 9),最小列数显示在输出的第一行中。
答案1
如果您有最新 (> 4.0) 版本的 GNU awk:
gawk '
{a[NF]++}
END {
PROCINFO["sorted_in"]="@ind_num_asc";
for (i in a) printf "%d (%d)\n", a[i], i;
}' file
4 (1)
1 (3)
3 (4)
1 (9)
答案2
呆呆地方法(使用asorti
函数):
awk '{a[NF]++}END{ asorti(a,b); for(i in b) printf("%d (%d)\n",a[b[i]],b[i]) }' file
输出:
4 (1)
1 (3)
3 (4)
1 (9)
asorti(a,b)
- 按索引对数组进行排序
答案3
如果将表中的每个单元格视为占位符以创建所需的结果,则可以对重复行进行排序和计数,以确定有多少行具有相同数量的列。
a=$(sed 's/\([0-9]\+\)/1/g' file | sort | uniq -c)
dups=$( echo "$a" | cut -d' ' -f7 )
之后,您可以计算每行的单词数,以确定该行中有多少列。
words=$(echo "$a" | cut -d' ' -f8- | awk '{print NF}')
paste <(echo "$dups") <(echo "$words")
4 1
1 3
3 4
1 9
答案4
最简单的版本是
cat data.txt | awk '{counts[NF] += 1} END { for (row_count in counts) { printf "%d (%d)\n", counts[row_count], row_count; }'
它只是使用NF
变量来给出行中的字段数量并更新字典中与其关联的相关值。然后在流的末尾,它只是迭代字典的所有键并以请求的格式打印它们。