매우 큰 파일에서 각 열을 개별적으로 숫자로 정렬하려고 합니다. 빠르게 명령어가 필요해서 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]
i
j
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