shell - grep valora y reorganiza el archivo
awk sed (6)
Como una alternativa a las soluciones awk
y grep
.
sed -rn ''s|.*"([^"]*)"/>|/1|p'' xml | pr -2ats/
hola, tengo un nombre de archivo test.txt
(standard input):8: <property name="ProcedureName" value="abc"/>
(standard input):7: <property name="PackageName" value="123abc"/>
(standard input):8: <property name="ProcedureName" value="bac"/>
(standard input):7: <property name="PackageName" value="bac123"/>
(standard input):8: <property name="ProcedureName" value="cde"/>
(standard input):7: <property name="PackageName" value="cd123"/>
(standard input):8: <property name="ProcedureName" value="b4u"/>
(standard input):7: <property name="PackageName" value="b4u234"/>
Tengo que grep solo los valores de packagename y procdeurename de este archivo en el siguiente formato: en un archivo o / p
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
intenté cortar y awk pero no pude conseguir eso
Con GNU grep and paste:
grep -oP ''"/K[^"]*(?="/)'' file | paste -d / - -
Salida:
abc/123abc bac/bac123 cde/cd123 b4u/b4u234
Mi primer intento (y el que realmente recomendaría) fue el mismo que el de @ sat, así que lo eliminé y aquí hay un enfoque diferente en caso de que sea útil en otro contexto:
$ awk -F''"'' ''{n2v[$2]=$4} !(NR%2){print n2v["ProcedureName"] "/" n2v["PackageName"] }'' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
n2v
significa name2value
, un nombre de matriz que a menudo uso para el tipo de aplicación donde tenemos asignaciones de nombre a valor en el archivo de entrada.
Prueba este awk
:
awk -F''"'' ''NR%2{p1=$4;next} {print p1 "/" $4}''
Prueba:
$ awk -F''"'' ''NR%2{p1=$4;next} {print p1 "/" $4}'' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
awk
debería poder hacer esto por usted:
awk -F''"'' ''BEGIN { OFS="/" } $2=="ProcedureName"{procedureName=$4} $2=="PackageName" { print procedureName,$4 }'' yourfilename
Esto usará una comilla doble como separador. Comprueba la cadena "ProcedureName" en la posición 2 y almacena la posición 4 en la variable procedureName
. Luego, si encuentra "PackageName" en la posición 2, imprime el procedureName
almacenado y el material de la posición 4. Y utiliza la barra invertida como OutputFieldSeperator.
Técnicamente, podrías conectar tu grep
a esto, pero awk
solo puede hacer la búsqueda en sí, que es lo que escribí aquí.
Esto podría funcionar para usted (GNU sed):
sed ''N;s#.*value="/([^"]*/)".*value="/([^"]*/)".*#/1//2#'' file
Lea dos líneas a la vez y extraiga los valores entre comillas dobles precedidas por el value=
literal value=
.
Otra versión un poco más corta que utiliza una referencia inversa en la opción LHS y -r
para facilitar la lectura de la expresión regular:
sed -r ''N;s#.*(value=")([^"]*)".*/1([^"]*)".*#/2//3#'' file
Otra forma más, usando el espacio de espera y la sustitución:
sed -r ''s/.*"(.*)".*//1/;h;N;s///1/;H;g;s#/n#/#'' file
Extrae el último valor entre comillas dobles en dos líneas sucesivas y reorganiza los resultados a la cadena requerida.