![열/행 길이를 기준으로 파일 정렬](https://linux55.com/image/28538/%EC%97%B4%2F%ED%96%89%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%20%EC%A0%95%EB%A0%AC.png)
첫 번째 열의 문자 수를 기준으로 파일을 정렬해야 합니다.
나는 무엇을 해야할지 모르겠습니다. (Linux에서는 sed/awk/sort를 사용할 수 있습니다.)
한 가지 예:
.abs is bla bla 12
.abc is bla se 23 bla
.fe is bla bla bla
.jpg is pic extension
.se is for swedish domains
내가 원하는 것은 각 행의 첫 번째 열 길이를 기준으로 행을 정렬하는 것입니다. 일부 줄은 4자로 시작하고 일부 줄은 3~2자로 시작합니다. 나는 결과가 다음과 유사하길 원합니다:
.fe is bla bla bla
.se is for swedish domains
.abs is bla bla 12
.abc is bla se 23 bla
.jpg is pic extension
가능합니까?
답변1
awk
먼저 를 사용하여 문자 수를 포함하는 다른 열을 추가한 sort
다음 추가된 열을 제거할 수 있습니다.
awk '{printf "%d %s\n", length($1), $0}' file.txt | sort -n -k1,1 | sed -E -e 's/^[0-9]+ //'
답변2
기본 쉘 도구를 사용하여 수행할 수 있습니다., 그러나 Perl을 사용하면 요구 사항을 보다 직접적으로 표현할 수 있습니다.
perl -l -e 'print sort {@a = split(/ /, $a, 2); @b = split(/ /, $b, 2);
length($a[0]) <=> length($b[0])} <>'
와 함께슈워츠 변환(대량 입력에 더 효율적):
perl -l -e 'print map {$_->[0]}
sort {length($a->[1]) cmp length($b->[1])}
map {[$_, split(/ /, $_, 2)]} <>'
Python을 사용하는 경우 코드는 더 장황하지만 더 명확합니다.
python -c 'import sys;
lines = sys.stdin.readlines();
lines.sort(key=lambda line: len(line.split()[0]));
sys.stdout.writelines(lines)'
답변3
$ awk -vOFS='\t' '{ print length($1), $0 }' file.in | sort -k1,1n -k2,2 | cut -f2-
.fe is bla bla bla
.se is for swedish domains
.abc is bla se 23 bla
.abs is bla bla 12
.jpg is pic extension
이렇게 하면 첫 번째 열의 데이터 길이에 따라 파일이 정렬되고 file.in
, 첫 번째 열의 실제 데이터가 사전순으로 정렬됩니다(질문에서 특별히 요구되지는 않지만 결과를 잘 처리할 수 있음).
이 awk
코드는 다음과 같이 탭으로 구분된 출력을 생성합니다.
4 .abs is bla bla 12
4 .abc is bla se 23 bla
3 .fe is bla bla bla
4 .jpg is pic extension
3 .se is for swedish domains
이것이 sort
첫 번째 열(숫자순)으로 정렬된 다음 두 번째 열(사전순)으로 정렬됩니다. 그런 다음 cut
첫 번째 열을 삭제하십시오.