按每行的单词数对行进行排序

Cal*_* Xu 14 text-processing sort

给定输入:

hello: world foo bar baz
bar:
baz: bin boop bop fiz bang beep
bap: bim bam bop
boatkeeper: poughkeepsie
Run Code Online (Sandbox Code Playgroud)

我想将其分为顶部的大多数单词,至少在最后,如下所示:

baz: bin boop bop fiz bang beep
hello: world foo bar baz
bap: bim bam bop
boatkeeper: poughkeepsie
bar:
Run Code Online (Sandbox Code Playgroud)

我将如何使用sort或其他工具执行此操作?

小智 22

你可以这样做:

awk '{print NF,$0}' file | sort -nr | cut -d' ' -f 2-
Run Code Online (Sandbox Code Playgroud)

我们使用awk前缀为每行的字段数。然后我们sort按那个数字并用 删除它cut


jim*_*mij 6

在最近的 GNU 中,awk可以使用PROCINFOarray 来定义许多内部参数,包括打印数组元素的顺序(由 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
Run Code Online (Sandbox Code Playgroud)


Nat*_*dge 5

Perl 单行:

print sort { split(' ',$a) <=> split(' ',$b) } <>;
Run Code Online (Sandbox Code Playgroud)

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

print sort { split(' ',$a) <=> split(' ',$b) or $a cmp $b } <>;
Run Code Online (Sandbox Code Playgroud)