Tengo un archivo grande en el siguiente formato:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Si los valores en la columna 2 coinciden, quiero sumar los valores en la columna 3 y 4 de ambas líneas, de lo contrario solo la suma de los valores en la línea única.
Entonces el resultado que espero se vería así:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Puedo ordenar los archivos de acuerdo con la columna 2 con awko sorty sumar las últimas columnas con awk, pero solo para líneas individuales, no para dos líneas donde la columna 2 coincide.
text-processing
awk
sort
uniq
TomPio
fuente
fuente

$1 $2como la clave.Respuestas:
Haría esto en Perl:
O awk:
Si desea que la salida se ordene de acuerdo con la segunda columna, simplemente puede canalizar
sort:Tenga en cuenta que ambas soluciones incluyen la primera columna también. La idea es usar la primera y segunda columnas como claves para un hash (en perl) o una matriz asociativa (en awk). La clave en cada solución es
column1 column2que si dos líneas tienen la misma columna dos pero una columna diferente, se agruparán por separado:fuente
Quizás esto podría ayudar, pero ¿la columna 1 es siempre 2 y los resultados dependen de ello?
o como lo mencionó Glenn Jackman en los comentarios sobre la clasificación:
fuente
PROCINFO["sorted_in"] = "@ind_num_asc"lugar de conectarlo asort. ref gnu.org/software/gawk/manual/html_node/…Puede ordenar previamente los datos y dejar que awk maneje los detalles:
Es posible que desee restablecer el acumulador:
Salida:
Si realmente desea mantener la primera columna, haga algo como esto:
Salida:
Explicación
La
pvariable contiene el$2valor de la línea anterior, o$1FS$2en el segundo caso anterior. Esto significa que{print p,s}se activa cuando$2la línea anterior no es la misma que la de la línea actual (p!=$2).fuente
sort -k2para ordenar por la segunda columnaUsando util navaja suiza
mlr:Salida:
Notas:
--nidxle dicemlrque use nombres de campo numéricos.put '$5=$3+$4'crea un nuevo quinto campo, la suma de los campos 3 y 4 .La
stats1función (o " verbo ") es una navaja suiza más pequeñodentro de la mayor navaja suiza de
mlr, con varias funciones basadas acumuladores tales comosum,count,mean, etc.stats1 -g 1,2agrupa los datos por las columnas 1 y 2 , y-f 5 -a sumluego suma el campo 5 de esos grupos .stats1imprime solo los campos con nombre.fuente