awk 如何用新行替换空格并同时删除空行?

awk 如何用新行替换空格并同时删除空行?

我正在尝试计算txt文件中每个单词的数量。

单词.txt

the day is sunny the the
the sunny is is

预期结果:

the 4
is 3
sunny 2
day 1

我想要

1)用新行替换所有空格

awk -v RS=" " '{print}' words.txt

结果

the
day
is
sunny
the
the
the
sunny
is
is
    #empty line 

2)删除空行

awk 'NF>0 {print}' words.txt |sort | uniq -c |sort -bnr

结果

1 the sunny is is
1 the day is sunny the the

如何将以上 2 个脚本合并为 1 行代码以产生预期结果?

答案1

没有真正需要通过将空格更改为换行符等来预处理文本,尤其是如果您想将操作合并到单个awk脚本中。

$ awk '{ for (i=1; i<=NF; ++i) count[$i]++ } END { for (word in count) print count[word], word }' file
4 the
2 sunny
3 is
1 day

它会遍历每个以空格分隔的单词并对其进行计数。计数存储在count按单词索引的数组中。最后,输出计数和相应的单词。这将自动跳过空行,因为它们不包含单词。

如果您需要对此进行排序,请将其通过管道传输sort -n

如果你使用 GNU awk,你可以使用它的asorti()函数在块中进行排序END

END {
    n = asorti(count, c2, "@val_num_desc")
    for (i=1; i<=n; i++ )
        printf("%d %s %s\n", i, count[c2[i]], c2[i])
}

答案2

@Kusalananda 已经提供了一个很好的 awk 解决方案,但也可以:

$ tr ' ' '\n' < file | sort | uniq -c
      1 day
      3 is
      2 sunny
      4 the

答案3

如果您有 GNU grep,则可以使用-o( --only-matching) 选项来显示每行一个匹配项:

grep -o '\S\+' words.txt

然后像以前一样通过管道传递到sortuniq

相关内容