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 awk
o sort
y 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 $2
como 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 column2
que 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
p
variable contiene el$2
valor de la línea anterior, o$1FS$2
en el segundo caso anterior. Esto significa que{print p,s}
se activa cuando$2
la línea anterior no es la misma que la de la línea actual (p!=$2
).fuente
sort -k2
para ordenar por la segunda columnaUsando util navaja suiza
mlr
:Salida:
Notas:
--nidx
le dicemlr
que use nombres de campo numéricos.put '$5=$3+$4'
crea un nuevo quinto campo, la suma de los campos 3 y 4 .La
stats1
funció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,2
agrupa los datos por las columnas 1 y 2 , y-f 5 -a sum
luego suma el campo 5 de esos grupos .stats1
imprime solo los campos con nombre.fuente