awk – ¿Cómo imprimir determinadas columnas por nombre?

Pregunta:

Tengo el siguiente archivo:

id  name  age
1   ed    50
2   joe   70   

Quiero imprimir solo las columnas de id y age . En este momento solo uso awk :

cat file.tsv | awk '{ print $1, $3 }'

Sin embargo, esto requiere conocer los números de las columnas. ¿Hay alguna manera de hacerlo en la que pueda usar el nombre de la columna (especificado en la primera fila), en lugar del número de columna?

Respuesta:

Quizás algo como esto:

$ cat t.awk
NR==1 {
    for (i=1; i<=NF; i++) {
        ix[$i] = i
    }
}
NR>1 {
    print $ix[c1], $ix[c2]
}
$ awk -f t.awk c1=id c2=name input 
1 ed
2 joe
$ awk -f t.awk c1=age c2=name input 
50 ed
70 joe

Si desea especificar las columnas para imprimir en la línea de comando, puede hacer algo como esto:

$ cat t.awk 
BEGIN {
    split(cols,out,",")
}
NR==1 {
    for (i=1; i<=NF; i++)
        ix[$i] = i
}
NR>1 {
    for(i=1; i <= length(out); i++)
        printf "%s%s", $ix[out[i]], OFS
    print ""
}
$ awk -f t.awk -v cols=name,age,id,name,id input 
ed 1 ed 50 1 
joe 2 joe 70 2 

(Tenga en cuenta el -v para obtener la variable definida en el bloque BEGIN ).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım