Neuanordnen der Spaltendaten basierend auf der alphabetischen Reihenfolge

Neuanordnen der Spaltendaten basierend auf der alphabetischen Reihenfolge

Ich möchte die Reihenfolge der Spaltendaten basierend auf der alphabetischen Reihenfolge ändern

Eingang

c,a,b
e,k,d

Ausgabe

a,b,c
d,e,k

derzeit verwende ich den folgenden Code

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 

Können Sie mir bitte mit einer einfacheren Lösung helfen, um Dateien mit 4 oder mehr Spalten zu handhaben?

Antwort1

Wenn Sie damit einverstanden sind perl:

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

-F,gibt die zu teilende Eingabezeile als Trennzeichen an und das Ergebnis ist über ein Array ,verfügbar@F

sort @Fsortiert alphabetisch und das resultierende Array wird kombiniert, indem als Trennzeichen joinverwendet wird,


MitGNU 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

Sehengawk-Handbuch: Verwenden vordefinierter Array-Scan-Reihenfolgenfür Details zur oben verwendeten Array-Reihenfolge

Antwort2

Mit GNU awk für sorted_in:

$ 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

sortoder mit jedem awk, wird aber viel langsamer ausgeführt, da für jede Eingabezeile eine Shell zum Aufrufen von UNIX gestartet wird :

$ 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

Das sub(/\r$/,"")liegt daran, dass Ihre gepostete Beispieleingabe DOS-Zeilenenden enthält, Ihre gepostete erwartete Ausgabe jedoch nicht.

Antwort3

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

Erläuterung:

            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

verwandte Informationen