给定输入:
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="")