열/행 길이를 기준으로 파일 정렬

열/행 길이를 기준으로 파일 정렬

첫 번째 열의 문자 수를 기준으로 파일을 정렬해야 합니다.

나는 무엇을 해야할지 모르겠습니다. (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첫 번째 열을 삭제하십시오.

관련 정보