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+=$3
Puede 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 :)sed
se 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 contrased
el espacio del patrón, que es una cadena delimitada (por defecto) por cada\n
cará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
sed
sintaxis de comandos.sed
La 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
sed
es no sólo un programa, sino, más bien, el compilado ejecutable llamadosed
en mi Unix máquina es una aplicación de la bien definida, históricamente establecida, y las normas controlado porsed
la aplicación de Regular- de mi sistema bibliotecas coincidentes de expresiones.De la
sed
especificació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 ...
...
sed
primero 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,
sed
simplemente 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 unP
carácter.s//&+pc/3
3
tercera 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
sed
entrada, escribe en su stdout, dados sus datos de ejemplo:Esto puede parecer extraño, pero la
dc
calculadora cita cadenas en su entrada entre corchetes, y elP
comando imprimirá la parte superior de la pila sin\n
agregar una línea e y luego la quitará de la pila de entrada.Y así, usando la primera línea allí como ejemplo,
dc
hará:[2015-01 ]P
P
rint y pop la parte superior de la pila5000
5000
en la parte superior de la pila y empuje todos los elementos actualmente en la pila (ahora ninguno) hacia abajo en uno.1000
+
6000
.[
cadena]
.p
p
rint la parte superior de la pila seguido de un\n
ewline adjunto sin sacarlo de la pila.c
c
Lear la pilafuente