줄당 단어 수로 줄 정렬


14

주어진 입력 :

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도구 나 다른 도구를 어떻게 사용합니까?


분명히하기 위해 줄 길이별로 정렬하지 않는 단어 수를 기준으로 정렬하려고합니다 (샘플 입력으로 가장 많은 단어가있는 줄도 가장 길지만 항상 그렇지는 않습니다)?
don_crissti

예. 단어가 가장 많은 줄이 반드시 가장 긴 줄은 아닙니다. 예를 들어 나는 bin: bop boop전에 원한다 boatkeeper: poughkeepsie. 두 줄이 같은 수의 단어를 공유하는 경우 알파벳 순서로 묶기를 선호하지만 필수 사항은 아닙니다.
Caleb Xu

답변:


22

당신은 다음과 같은 것을 할 수 있습니다 :

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

awk각 줄에 필드 수를 접두사로 사용 합니다. 그런 다음 sort그 번호로을 제거합니다 cut.


이것은 효과가 있었다. 주문이 왜 취소되었는지 궁금했지만 지금 수정 내용을 확인했습니다.
Caleb Xu

6

최근 GNU에서는 배열을 사용하여 배열 요소가 인쇄되는 순서 (element에 의해 제어되는 순서)를 포함하여 많은 내부 매개 변수를 정의 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

1
+1도 같은 생각을하고 있었지만 입력을 중복 제거하면 부작용이있을 수 있습니다.
스틸 드라이버

@steeldriver 당신은 절대적으로 정확합니다, 나는 내 대답을 편집했습니다.
jimmij

이렇게하면 단어를 보조 정렬 키로 정렬하는 대신 필드 수가 동일한 레코드간에 원래 순서가 유지됩니다. 키가 NF" "$0" "NR인 경우 NR대체 / 중복 처리 메커니즘 만 사용할 수 있습니다.
Peter Cordes

1
@PeterCordes 그러나 단어의 순서를 반대로 바꾸면, 정의에 따라 자체 기능으로 알파벳순으로 다른 관계를 해결할 방법이 없습니다-gnu cmp_func()awk가 허용합니다.
jimmij

5

펄 원 라이너 :

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="")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.