행당 단어 수를 기준으로 행 정렬

행당 단어 수를 기준으로 행 정렬

주어진 입력:

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

펄 한 줄:

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

관련 정보