1行あたりの単語数に基づいて行を並べ替える

1行あたりの単語数に基づいて行を並べ替える

与えられた入力:

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"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

パール1行:

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

アルファベット順を使用してタイを切断するには:

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

答え4

Pythonで。

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="")

関連情報