awk를 사용하여 파일의 각 열을 개별적으로 숫자로 정렬

awk를 사용하여 파일의 각 열을 개별적으로 숫자로 정렬

매우 큰 파일에서 각 열을 개별적으로 숫자로 정렬하려고 합니다. 빠르게 명령어가 필요해서 awk 명령어로 해보려고 합니다.

입력 예:

1,4,2,7,4
9,2,1,1,1
3,9,9,2,2
5,7,7,8,8

예제 출력:

1,2,1,1,1
3,4,2,2,2
5,7,7,7,4
9,9,9,8,8

나는 그 일을 수행하는 것을 만들었습니다(그러나 그것은 나에게 필요한 강력한 awk 명령이 아닙니다):

for i in $(seq $NumberOfColumns); do 
  SortedMatrix=$(paste <(echo "$SortedMatrix") <(awk -F ',' -v x=$i '{print $x}' File | sort -nr) -d ,)
done

하지만 느리다!
나는 awk에서 이것을 시도했고 거의 비슷하다고 생각합니다.

SortedMatrix=$(awk -F ',' 'NR==FNR {for (i=1;i<=NF;i++) print|"sort -nr"}' File)

하지만 열(단지 긴 열)이 출력되지 않습니다. 왜 그렇게 하는지 이해하지만 수정 방법을 모르겠습니다. awk에서 붙여넣기를 사용할 생각인데 구현 방법을 모르겠습니다. 그것.

awk에서 이 작업을 수행하는 방법을 아는 사람이 있나요? 어떤 도움이나 안내도 크게 감사하겠습니다.

답변1

단일 GNU awk에서 이 작업을 수행할 수 있습니다.

gawk -F ',' '
    {
        for(i=1;i<=NF;i++){matrix[i][NR]=$i}
    }
    END{
        for(i=1;i<=NF;i++){asort(matrix[i])}
        for(j=1;j<=NR;j++){
            for(i=1;i<NF;i++){
                printf "%s,",matrix[i][j]
            }
            print matrix[i][j]
        }
    }
' file
  • for(i=1;i<=NF;i++){matrix[i][NR]=$i}

다차원 배열(GNU 확장)은 열과 행 의 수를 포함 matrix하도록 채워집니다 .matrix[i][j]ij

  • for(i=1;i<=NF;i++){asort(matrix[i])}

각 열을 정렬합니다(GNU 확장).

  • 마침내

    for(j=1;j<=NR;j++){
        for(i=1;i<NF;i++){
            printf "%s,",matrix[i][j]
        }
        print matrix[i][j]
    }
    

각 줄에 대해 일련의 a[1],, a[2],, ..., a[NF-1],을 인쇄합니다.a[NF]\n

답변2

사용 python:

python3 -c 'import sys
L = [] 
with open(sys.argv[1]) as fh:
  L = [line.rstrip("\n").split(",") for line in fh] 
print(*[",".join(j) for j in zip(*[sorted(i,key=int) for i in zip(*L)])],sep="\n")
' file

목록의 목록(행렬)에 파일을 로드합니다. L.

내장된 zip을 사용하여 데이터를 전치하세요.

전치 행렬의 행을 수치적으로 정렬합니다.

다시 조옮김하고 한 줄씩 인쇄합니다.

산출:

1,2,1,1,1
3,4,2,2,2
5,7,7,7,4
9,9,9,8,8

관련 정보