Tengo un archivo en el siguiente formato:
$ cat /tmp/raw
2015-01 5000 1000
2015-02 6000 2000
2015-03 7000 3000
Ahora, lo que quiero es obtener el valor combinado de las columnas 2 y 3 en cada fila para que los resultados sean los siguientes:
2015-01 6000
2015-02 8000
2015-03 9000
Intenté esto pero solo muestra el último valor en el archivo como el valor 2015-03.
text-processing
Syed Jahanzaib
fuente
fuente

Aquí hay algunas maneras:
Otro enfoque awk
Perl
o
Shell (mucho más lento / menos eficiente que el anterior)
fuente
$2+=$3Puede ser más incómodo.awk '{$2+=$3}NF--'para que no haya todavía un campo en blanco 3 colgando. Aunque esa es solo mi preferencia, y es demasiado similar para publicar como respuesta por sí mismo :)sedse las arregla para comprender los campos , incluso para definir campos sobre la marcha, y campos con campos , sino que, como aparentemente es el caso, todo el concepto de coincidencia de expresiones regulares de Unix se basa realmente en dividir una cadena en campos de acuerdo a un patrón ! ¿Quien sabe?...huellas dactilares...
Así que arriba declaro una expresión regular que define una extensión de campo que consiste en una secuencia única de caracteres de
*longitud variable que^no son <espacio> seguida inmediatamente por una secuencia única de caracteres de*longitud variable que son <espacio> . Esta declaración se aplica contrasedel espacio del patrón, que es una cadena delimitada (por defecto) por cada\ncarácter de línea de línea que aparece en la entrada, y que se reemplaza recursivamente (por defecto) con el siguiente para cada aparición de la misma.La interfaz para esta declaración es doble, y en cada nivel está completamente regulada y especificada por al menos un comité de estándares oficial internacional de IEEE para garantizar la aplicación predecible de la
sedsintaxis de comandos.sedLa sintaxis de API , por ejemplo, se aplica en este caso con el comando de/dirección (que siempre es el primer componente de cualquier comando de sustitución) , pero el contenido del mismo es interpretado por una API más básica como un subconjunto del especificado para función en la biblioteca C estándar ./sed s///regcomp()Puedo hacer estas declaraciones con confianza, porque
sedes no sólo un programa, sino, más bien, el compilado ejecutable llamadoseden mi Unix máquina es una aplicación de la bien definida, históricamente establecida, y las normas controlado porsedla aplicación de Regular- de mi sistema bibliotecas coincidentes de expresiones.De la
sedespecificación:... donde encontramos ...
Una aplicación que llama
regcomp()presentará una cadena de patrón y ...Para actuar sobre eso, dicha aplicación se referiría a
regcomp()la función complementaria de ...Y así cuando lo hago ...
...
sedprimero compila la expresión regular y almacena los resultados en la memoria, luego aplica el autómata compilado almacenado allí al contenido de mi espacio de patrones tantas veces como sea necesario para cumplir mi comando. Cada vez que lo hace, el resultado es una matriz de uno o más campos delimitados por nulos como delimitados en los desplazamientos devueltos porregexec().Y cuando lo haga ...
... para indicar que se debe usar la expresión regular definida más recientemente,
sedsimplemente puede llamarregexec()nuevamente reutilizando la expresión regular precompilada, pero posiblemente aplicándola esta vez a un argumento de cadena cambiado o aplicando nuevos parámetros nmatch como comando.Más específicamente aún ...
s/[^ ]* */[&]P/[corchete izquierdo, luego en&sí mismo, luego un]corchete derecho seguido de unPcarácter.s//&+pc/33tercera aparición de patrón en el espacio de patrón con&ella misma seguida de la cadena adjunta+pc.Y así, para cada línea de
sedentrada, escribe en su stdout, dados sus datos de ejemplo:Esto puede parecer extraño, pero la
dccalculadora cita cadenas en su entrada entre corchetes, y elPcomando imprimirá la parte superior de la pila sin\nagregar una línea e y luego la quitará de la pila de entrada.Y así, usando la primera línea allí como ejemplo,
dchará:[2015-01 ]PPrint y pop la parte superior de la pila50005000en la parte superior de la pila y empuje todos los elementos actualmente en la pila (ahora ninguno) hacia abajo en uno.1000+6000.[cadena].pprint la parte superior de la pila seguido de un\newline adjunto sin sacarlo de la pila.ccLear la pilafuente