알파벳 순서에 따라 열 데이터 재정렬

알파벳 순서에 따라 열 데이터 재정렬

컬럼 데이터의 순서를 알파벳 순서로 변경하고 싶어요

입력

c,a,b
e,k,d

산출

a,b,c
d,e,k

현재 아래 코드를 사용하고 있습니다

awk -F"," -v OFS="," '{ 
if($1<=$2 && $2<=$3) 
{print $1,$2,$3} 
else if($1<=$2 && $3<=$2) 
{print $1,$3,$2} 
else if($2<=$1 && $1<=$3) 
{print $2,$1,$3} 
else if($2<=$1 && $3<=$1) 
{print $2,$3,$1} 
else if($3<=$2 && $2<=$1) 
{print $3,$2,$1} 
else 
{print $3,$1,$2}}' test.txt 

4개 이상의 열이 있는 파일을 처리하는 더 간단한 솔루션을 제공해 주시겠습니까?

답변1

당신이 괜찮다면 perl:

$ perl -F, -lane 'print join ",", sort @F' ip.txt
a,b,c
d,e,k

-F,구분 기호 로 분할할 입력 라인을 지정 하고 결과는 배열을 ,통해 사용할 수 있습니다.@F

sort @F알파벳순으로 정렬되고 결과 배열은 구분 기호를 join사용 하여 결합됩니다.,


와 함께GNU awk

$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_str_asc"}
       {s = ""; c=0; split($0,a,",");
        for(k in a) s = c++ ? s "," a[k] : a[k];
        print s}' ip.txt
a,b,c
d,e,k

보다gawk 매뉴얼: 미리 정의된 배열 스캔 순서 사용위에 사용된 배열 순서에 대한 자세한 내용

답변2

sorted_in에 대해 GNU awk를 사용하면:

$ cat tst.awk
BEGIN {
    FS=OFS=","
}
{
    sub(/\r$/,"")
    print sort($0)
}

function sort(inStr,    arr,idx,sep,outStr) {
    PROCINFO["sorted_in"] = "@val_str_asc"
    split(inStr,arr)
    for (idx in arr) {
        outStr = outStr sep arr[idx]
        sep = OFS
    }
    return outStr
}

$ awk -f tst.awk file
a,b,c
d,e,k

sort또는 awk를 사용하지만 각 입력 줄에 대해 UNIX를 호출하는 쉘을 생성하므로 훨씬 느리게 실행됩니다 .

$ cat tst.awk
BEGIN {
    FS=OFS=","
}
{
    sub(/\r$/,"")
    print sort($0)
}

function sort(inStr,    cmd,line,sep,outStr) {
    gsub(/,/,"\n",inStr)
    cmd = "printf \047%s\n\047 \047" inStr "\047 | sort"
    while ( (cmd | getline line) > 0 ) {
        outStr = outStr sep line
        sep = OFS
    }
    close(cmd)
    return outStr
}

$ awk -f tst.awk file
a,b,c
d,e,k

이는 sub(/\r$/,"")게시된 샘플 입력에는 DOS 줄 끝이 있지만 게시된 예상 출력에는 없기 때문입니다.

답변3

perl -nlE 'say join ",", sort split ","'   file.txt

설명:

            for each line like "r,d,a":
 "r,d,a"
    ↓          split ","  it
("r","d","a")
    ↓          sort       it
("a","d","r")
    ↓          join ","   it
 "a,d,r"
               say it

관련 정보