Reorganizar los datos de las columnas según el orden alfabético

Reorganizar los datos de las columnas según el orden alfabético

Quiero cambiar el orden de los datos de las columnas según el orden alfabético

Aporte

c,a,b
e,k,d

Producción

a,b,c
d,e,k

actualmente, estoy usando el siguiente código

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 

¿Podría ayudarme con una solución más sencilla para manejar archivos que tengan 4 o más columnas?

Respuesta1

Si estás de acuerdo con perl:

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

-F,especifica la línea de entrada que se dividirá ,como delimitador y el resultado está disponible a través de@F una matriz

sort @FSe ordenará alfabéticamente y la matriz resultante se combinará joinutilizando ,como separador.


ConGNU 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

Vermanual gawk: Uso de órdenes de escaneo de matrices predefinidaspara obtener detalles sobre el orden de las matrices utilizadas anteriormente

Respuesta2

Con GNU awk para 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

o con cualquier awk pero se ejecutará mucho más lento ya que genera un shell para llamar a UNIX sortpara cada línea de entrada:

$ 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

Esto sub(/\r$/,"")se debe a que tiene finales de línea de DOS en la entrada de muestra publicada, pero no en la salida esperada publicada.

Respuesta3

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

Explicación:

            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

información relacionada