UNIX: fusionar archivos con diferentes extensiones en un solo archivo

UNIX: fusionar archivos con diferentes extensiones en un solo archivo

Por ejemplo: en mi directorio /temp tengo 100 archivos... 50 con la extensión .msg y 50 con .xml.

/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml

y

/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg

En un archivo de texto, me gustaría generar una combinación de los contenidos de los archivos .xml y .msg, uno tras otro. Por ejemplo, el archivo de salida debería verse así:

content of test1.xml
content of test1.msg
content of test2.xml
content of test2.msg
content of test3.xml
content of test3.msg
............
content of test49.xml
content of test49.msg
content of test50.xml
content of test50.msg

en este directorio /temp siempre habrá una cantidad igual de archivos .msg y .xml. Además, ¿será posible mostrar la ruta o el nombre del archivo antes del contenido en el archivo de salida? Por ejemplo:

text1.xml: content of test1.xml 
text1.msg: content of test1.msg
text2.xml: content of test2.xml
text2.msg: content of test2.msg
text3.xml: content of test3.xml
text3.msg: content of test3.msg
....................
text49.xml: content of test49.xml
text49.msg: content of test49.msg
text50.xml: content of test50.xml
text50.msg: content of test50.msg

He probado una tubería simple para archivar.

cat * > text.txt

pero esto no da el resultado requerido. En el archivo de salida, primero enumera el contenido de todos los archivos *.xml y luego los archivos *.msg.

Por favor asiste.

Respuesta1

for f in *xml ; do
  cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE

Podría funcionar para usted, si está utilizando el bashshell. De lo contrario (otros shells POSIX) utilice: cat "$f" "${f%.xml}.msg"en lugar de la línea anterior cat.

Respuesta2

En este tipo de situaciones, suele tener sentido proceder de la siguiente manera:

  1. Enumere todos los archivos en un archivo de texto:

    $ ls > files
    
  2. Edite el archivo de texto para eliminar archivos no deseados y organizar los restantes en el orden exacto que desee.

  3. Luego simplemente haga esto (asumiendo que ninguno de los archivos tenga espacios o caracteres divertidos en sus nombres):

    $ cat $(cat files) > bigfile
    

Una variación de este enfoque es convertir el archivo de texto en un comando grande, desde

file1
file2
file with spaces 3
...
filen

a:

cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile

Luego simplemente obtenga el archivo como un script:

$ . ./files

Se puede agregar un espacio y una barra invertida a cada línea del búfer viusando :%s/$/ \\/.

Respuesta3

for i in {1..50}; do
    echo "text$i.xml: `cat text$i.xml`" >> output.txt
    echo "text$i.msg: `cat text$i.msg`" >> output.txt
done

Respuesta4

Si es una secuencia normal puedes hacer esto:

en fiesta:

for ITER in {1..50}
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

o si tienes la utilidadseq

for ITER in $(seq 1 50)
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

información relacionada