Para obtener todos los valores Cat
o Dog
del nodo name
en un documento XML como el suyo, puede usar xmlstarlet
así:
xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml
Esto generaría las palabras Cat
y Dog
como salida si existen en el documento como los valores de un nodo object
nodo name
secundario -. Esta operación sería difícil de hacer bien con grep
en caso de que haya otros nodos name
que no sean nodos -secundarios a nodos object
, o si algunos nodos name
tienen atributos, etc.
Desafortunadamente, xmlstarlet
no sale con un estado de salida no -cero si no puede encontrar nada en el archivo de entrada XML, por lo que debemos agregar un grep
al final de esto para verificar si obtuvimos algún resultado (esto se usará en el siguiente paso):
xmlstarlet sel -t -v '//object/name[text() = "Cat" or text() = "Dog"]' file.xml | grep '.'
Sin embargo, podemos ejecutar esto en todos los archivos de 10kfind
:
find. -type f -name '*.xml' -exec sh -c '
xmlstarlet sel -t -v "//object/name[text() = \"Cat\" or text() = \"Dog\"]" "$1" |
grep -q "."' sh {} ';' -print
Esto primero encontraría todos los archivos regulares en o debajo del directorio actual cuyos nombres terminan con .xml
. Para cada uno de estos archivos, xmlstarlet
se ejecuta para extraer las cadenas Cat
y Dog
de los nodos XML correctos, y grep
se usa para verificar si xmlstarlet
encontró algo. Ejecutar grep
con su opción -q
hace que la utilidad se silencie, pero saldrá con el estado de salida apropiado dependiendo de si coincidió con algo o no.
Si grep
encontró algo, find
imprime la ruta del archivo que contenía los datos.
С любым awk в любой оболочке на каждой машине UNIX для любого количества входных файлов,все, что вам нужно, это:
$ paste FileA FileB | awk '{o=$1; for (i=2; i<NF; i+=3) o=o"\t"$i; print o}'
A: 18.49 21.29
C: 14.49 38.71
B: 18.89 36.13
join fileA fileB |awk '{ print $1"\t"$2"\t"$3 }'.
Убедитесь, что оба файла отсортированы по одному и тому же столбцу.