如何按每行字符出现次数对文件进行排序?

inc*_*138 6 text-processing sort

我对 Linux 还是很陌生,我发现了很多关于如何在文件中进行字符计数的有用信息,但是在 Linux/终端中是否有一种方法可以按特定次数对文本文件进行排序每行出现一个字符?

例如给出:

baseball
aardvark
a man a plan a canal panama
cat
bat
bill
Run Code Online (Sandbox Code Playgroud)

按字母“a”的出现次数排序,得出:

a man a plan a canal panama
aardvark
baseball
cat
bat
bill
Run Code Online (Sandbox Code Playgroud)

关于每次出现“a”时的“cat”和“bat”,我不在乎计数相等的行的顺序是否颠倒,只对按字符频率排列的一般行感兴趣。

Sté*_*las 6

此类任务的一般方法是使用awkperl... 计算您感兴趣的指标并将其添加到行中,然后将其提供给sort并从排序输出中删除指标:

awk '{print gsub("a","a"), $0}' < file | sort -rn | cut -d' ' -f2-
Run Code Online (Sandbox Code Playgroud)

  • 这种技术被称为 [Schwartzian 变换](https://en.m.wikipedia.org/wiki/Schwartzian_transform) (2认同)

ter*_*don 5

另一个施瓦兹变换:

$ awk -Fa '{print NF,$0}' file | sort -nr | cut -d' ' -f2-
a man a plan a canal panama
aardvark
baseball
cat
bat
bill
Run Code Online (Sandbox Code Playgroud)

或者,在 Perl 中:

perl -Fa -lane 'print "$#F $_"' file | sort -nr | cut -d' ' -f2-
Run Code Online (Sandbox Code Playgroud)


yae*_*shi 0

#!/bin/bash
cat input.txt |
while IFS= read -r a; do
    b=${a//[^a]}
    echo "${#b} $a"
done | sort -rn | sed 's/[^ ]* //'
Run Code Online (Sandbox Code Playgroud)