El archivo de texto de entrada se ve así (hay más columnas en el archivo de texto real):
target_id length eff_length tot_counts uniq_counts est_counts eff_counts
mthl7 61 0 0 0 0 0
loqs 72 0 0 0 0 0
CG45085 58 0 0 0 0 0
CG18317 4978 1430.739479 91 0 30.333333 105.539363
CG18317 4978 1430.739479 91 0 30.333333 105.539363
CG18317 4978 1430.739479 91 0 30.333333 105.539363
para la columna 1 cuando tienen la misma identificación (por ejemplo, CG18317) quiero sumar los valores en el resto de las columnas. Entonces la salida se vería así:
target_id length eff_length tot_counts uniq_counts est_counts eff_counts
mthl7 61 0 0 0 0 0
loqs 72 0 0 0 0 0
CG45085 58 0 0 0 0 0
CG18317 14934 4292.218437 273 0 90.999999 316.618089
Intenté usar comandos como:
awk -F" "
'{a[$1]+=$4;b[$1]+=$5;c[$1]+=$6;d[$1]+=$7;e[$1]+=$8;f[$1]+=$9;g[$1]+=$10;h[$1]+=$11;i[$1]+=$12;j[$1]+=$14;}END{for (i in a) print i" "a[i]" "b[i]" "c[i]" "d[i]" "e[i]" "f[i]" "g[i]" "h[i]" "i[i]" "j[i]}' temp2.txt
El mensaje de error es:
awk: can't assign to i; it's an array name.
input record number 7, file temp2.txt
source line number 1
¿Esto se debe al encabezado? ¿Cómo debo omitir la primera fila?
Probé respuestas para preguntas similares que se encuentran aquí pero tampoco funcionó.
Respuesta1
$ awk 'NR==1{print;next} {for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{ \
for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}' file
target_id length eff_length tot_counts uniq_counts est_counts eff_counts
mthl7 61 0 0 0 0 0
loqs 72 0 0 0 0 0
CG18317 14934 4292.22 273 0 91 316.618
CG45085 58 0 0 0 0 0
Si desea mantener las líneas en el mismo orden, necesitará un poco más de código:
$ awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; \
for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; \
for (i=2;i<=NF;i++){s=s" "a[b[j]][i]}; print s}}' file | column -t
target_id length eff_length tot_counts uniq_counts est_counts eff_counts
mthl7 61 0 0 0 0 0
loqs 72 0 0 0 0 0
CG45085 58 0 0 0 0 0
CG18317 14934 4292.22 273 0 91 316.618
Arriba, también canalizamos la salida para column -t
alinear las columnas.
Comandos en formato adecuado para copiar y pegar.
Los comandos anteriores se han distribuido en varios para facilitar su visualización. Si desea copiar y pegar los comandos, utilice estas versiones:
awk 'NR==1{print;next} {for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{ for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}' file
Y:
awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; for (i=2;i<=NF;i++){s=s" "a[b[j]][i]}; print s}}' file | column -t
No GNUawk
Intentar:
awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; for (i=2;i<=NF;i++) {a[$1","i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; for (i=2;i<=NF;i++){s=s" "a[b[j]","i]}; print s}}' file | column -t