![행당 단어 수를 기준으로 행 정렬](https://linux55.com/image/71428/%ED%96%89%EB%8B%B9%20%EB%8B%A8%EC%96%B4%20%EC%88%98%EB%A5%BC%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%ED%96%89%20%EC%A0%95%EB%A0%AC.png)
주어진 입력:
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="")