
Así que tengo que revisar un registro que me envían por correo electrónico (en Windows), buscar una línea para determinar el número de serie del modelo. Pensé que una manera fácil de hacerlo era escribir un feo script por lotes para convertir el .msg, así que puede leer el archivo. ejemplo:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
eso me deja con 3 números únicos, ¿cómo agregaría ALPHA a la línea 1, BETA a la línea 2 y GAMMA a la línea 3 con un espacio o un: como delimitador?
Actualizar:el archivo a21s.txt
es similar a
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
Respuesta1
Hay muchas maneras de hacer lo que estás buscando, sólo un par de ejemplos.
awk
y una solución a medida
Una solución adaptada a su ejemplo es usar awk
y pasarle 3 variables. No es general porque si vas a tener 4 líneas tienes que pasar 4 variables y así sucesivamente...
El awk
comando tiene la forma sencilla de gestionar la columna a través de su número ( $1
, $2
... $NF
el último).
Sólo para que sea más sencillo de leer aquí, uso su antiguo archivo intermedio.
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- En la primera línea pasas 3 variables
awk
con la opción-v
. - En las siguientes líneas utilizas que la variable internaNR, lleva la cuenta del número de la línea. Entonces vas a imprimir la variable.s1, sólo cuando tienes la primera línea, las2con el segundo... y así sucesivamente.
- En la última línea después de
'
puede especificar el nombre del archivo para no tener que llamar alcat
proceso y canalizarlo alawk
indicado. - Si las variables (ALFA, BETA...) se pueden generar con algún mecanismo (por ejemplo, "Serial01, Serial02"), puede colocarlas en lugar de los controles en el número de línea y la variable externa.
- En la primera línea pasas 3 variables
Nota práctica:bajo *nix puedestrenes de comandoscanalizando (
|
) una salida a la siguiente sin necesidad de crear archivos intermedios.
Entonces, en tu ejemplo podrías usar directamente:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
En lugar de,
cut
en este caso, puede utilizar elawk
comandocat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
.
Una solución más general: paste
+awk
Digamos que tienes tu a21s.txt
archivo y otro ( b.txt
) con el mismo número de líneas y dentro de las cadenas (una palabra cada una) que deseas anteponer (como se muestra a continuación).
ALPHA
BETA
GAMMA
simplemente puedes usar
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
Tenga en cuenta que ahora la columna de su serie es el día 8 porque agregó otra antes con pegar.
Nota
Pregunte al propio Linux para obtener más información con man awk
yman paste
:-)
Respuesta2
eco ALFA>agrep.txt; gato "Pre.msg" | cadenas2>>agrep.txt
Puede que esa no sea la línea exacta... el concepto es que túprimeroQuiero poner la palabra "Alfa" en el archivo... usando un símbolo > crea el archivo, y usando un >> lo agrega al archivo. Sin una "nueva línea", debería poner la palabra ALPHA allí y luego agregar el primer mensaje.
Es posible que tengas que jugar un poco para que el código funcione exactamente.
EDITAR: Búsqueda encontrada usandogatoyimprimirfson mejores opciones que el eco, ya que el eco puede ser diferente según el sistema operativo
por ejemplo: gato ("ALFA:") > agrep.txt; gato "Pre.msg" | cadenas2>>agrep.txt
Y para hacer un comando de "una sola línea", la primera tubería debería haber sido ; o &&
; Los comandos intermedios siempre ejecutan el siguiente comando && entre comandos ejecuta el siguiente comando solo si el anterior tuvo éxito y || (doble tubería) ejecuta el siguiente comando solo si el anterior falló
Respuesta3
No estoy seguro de qué strings2
hace o cómo se ve su entrada, así que no puedo estar 100% seguro de que esto funcionará como se esperaba. Pero tal vez al menos le indique la dirección correcta. cat
puede aceptar entradas de stdin. Entonces, también podrías hacer
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt