按每行字数对行进行排序

按每行字数对行进行排序

给定输入:

hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop
boatkeeper: poughkeepsie

我想将其排序为顶部的大多数单词,至少在末尾,如下所示:

baz: bin boop bop fiz bang beep
hello: world foo bar baz
bap: bim bam bop
boatkeeper: poughkeepsie
bar:

我将如何使用sort或其他工具来做到这一点?

答案1

你可以这样做:

awk '{print NF,$0}' file | sort -nr | cut -d' ' -f 2-

我们使用awk为每行添加字段数作为前缀。然后我们sort按该数字并用 删除它cut

答案2

在最近的 GNU 中,awk我们可以使用PROCINFO数组来定义许多内部参数,包括打印数组元素的顺序(由 element 控制"sorted_in")。因此,我们可以构建一个以 的值索引的数组NF" "NR,哪些元素具有 的值,$0并将其打印在所需的输出中,在您的情况下,这将是"@ind_num_desc"

awk '{a[NF" "NR]=$0}END{PROCINFO["sorted_in"]="@ind_num_desc"; for(i in a) print a[i]}' file

答案3

Perl 一行:

print sort { split(' ',$a) <=> split(' ',$b) } <>;

如果您想使用字母顺序打破平局:

print sort { split(' ',$a) <=> split(' ',$b) or $a cmp $b } <>;

答案4

通过蟒蛇。

s = '''hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop'''.splitlines()
for i in sorted(s, key=lambda x: len(x.split()), reverse=True):
    print(i)

或者

with open('/path/to/the/input/file') as f:
    m = f.readlines()
    for i in sorted(m, key=lambda x: len(x.split()), reverse=True):
        print(i, end="")

相关内容