CSV 파일의 요소 정렬

CSV 파일의 요소 정렬

다음과 같이 행당 7개의 숫자가 있는 CSV 파일이 있습니다.

1083,20,28,42,23,10,43
1084,20,5,29,59,40,33
1085,39,50,21,12,40,55
1086,45,4,6,23,10,2
1087,36,46,28,32,3,20

첫 번째 숫자(열 1)를 유지하고 파일이 다음과 같이 보이도록 열 2에서 7까지 정렬하고 싶습니다.

1083,10,20,23,28,42,43
1084,5,20,29,33,40,59
1085,12,21,39,40,50,55
1086,2,4,6,10,45,23
1087,3,20,28,32,36,46

awk어떻게 이런 일을 할 수 있나요 sed?

감사해요

답변1

그리고 perl:

perl -F, -lape '$_ = join ",", shift @F, sort {$a <=> $b} @F' < input.csv

GNU 사용 awk:

gawk -F, '
  {
    split($0, a)
    printf "%s", a[1]
    delete a[1]
    n = asort(a)
    for (i = 1; i <= n ; i++) printf "%s", FS a[i]
    print ""
  }' < input.csv

아니면 join.awk도서관을 이용하세요(@WeijunZhou에게 감사드립니다)

gawk -i join -F, -v OFS=, '
  {
    split($0, a)
    first = a[1]
    delete a[1]
    n = asort(a)
    print first, join(a, 1, n, OFS)
  }'

답변2

직면한 문제는 파일에 MAC 줄 끝(\r)이 있는 반면 실행 중인 명령은 Unix 줄 끝(\n)을 가정한다는 것입니다.

사용 Perl:

$ perl -l015 -F, -0015 -pae '$_ = join ",", shift @F, sort { $a <=> $b } @F' input.csv

옵션:

  • -lORS=8진수15 로 설정합니다 \r.
  • -0RS=8진수15 로 설정합니다 \r.
  • -p레코드별로 csv 파일을 반복합니다. RS는 옵션에 \r설정된 대로 입력 파일의 레코드를 분할합니다 -0.
  • -F각 레코드를 읽을 때 필드 구분 기호가 쉼표로 설정됩니다.
  • -a각 레코드는 필드로 읽어져 배열에 저장될 때 분할됩니다 @F.
  • 참고: 옵션이 제공되는 순서가 중요합니다.

따라서 얻을 수 있는 출력에는 MAC 라인 엔딩도 있어야 합니다. 이것이 예상되는 출력이 표시되지 않는 이유입니다. 대신 여기에 제공된 모든 솔루션에 따라 모든 출력 레코드가 한 줄로 압축됩니다.

답변3

단순화를 위해 csv인용하지 않고 다음을 시도해 보십시오.

while IFS= read -r l; do
    col1=$(printf '%s' "$l" | cut -d, -f1)
    printf '%s,' "$col1"
    printf '%s' "$l" | cut -d, -f2- | grep -o "[0-9]*" | sort -n | paste -sd,
done < file

답변4

다음 awk 및 sed 메소드 조합을 사용해 보십시오.

j=awk '{print NR}' filename | sort -nr| sed -n '1p'

for ((i=1;i<=$j;i++)); do k=`awk -F "," -v  i="$i" 'NR==i {print $1}' i.txt` ;echo $k;awk -F "," -v i="$i" 'NR==i {$1=" ";print $0}' i.txt| sed -r "s/^\s+//g"| perl -pne "s/ /\n/g"| sort -n| perl -pne "s/\n/ /g";echo " "| sed "s/.*/&\n/g";done|sed '/^$/d'| sed "N;s/\n/ /g"| sed "s/ /,/g"| sed "s/\,*$//g"

산출

1083,10,20,23,28,42,43
1084,5,20,29,33,40,59
1085,12,21,39,40,50,55
1086,2,4,6,10,23,45
1087,3,20,28,32,36,46

관련 정보