UNIX: Mesclando arquivos com extensões diferentes em um arquivo

UNIX: Mesclando arquivos com extensões diferentes em um arquivo

Por exemplo: No meu diretório /temp tenho 100 arquivos. 50 com extensão .msg e 50 com .xml.

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

e

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

Em um arquivo de texto, gostaria de gerar uma combinação do conteúdo dos arquivos .xml e .msg, um após o outro. Por exemplo, o arquivo de saída deve ser semelhante a:

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

neste diretório /temp sempre haverá um número igual de arquivos .msg e .xml. Além disso, será possível mostrar o caminho ou o nome do arquivo antes do conteúdo do arquivo de saída? por exemplo:

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

Eu tentei um pipe simples para arquivar

cat * > text.txt

mas isso não dá o resultado necessário. No arquivo de saída, ele primeiro lista o conteúdo de todos os arquivos *.xml e depois dos arquivos *.msg.

Por favor ajude.

Responder1

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

Pode funcionar para você, se você estiver usando o bashshell. Caso contrário (outros shells POSIX) use: cat "$f" "${f%.xml}.msg"em vez da catlinha acima.

Responder2

Neste tipo de situações, muitas vezes faz sentido proceder da seguinte forma:

  1. Liste todos os arquivos em um arquivo de texto:

    $ ls > files
    
  2. Edite o arquivo de texto para remover arquivos indesejados e organizar os restantes na ordem exata desejada.

  3. Depois é só fazer isso (supondo que nenhum dos arquivos tenha espaços ou caracteres engraçados em seus nomes):

    $ cat $(cat files) > bigfile
    

Uma variação desta abordagem é transformar o arquivo de texto em um grande comando, de

file1
file2
file with spaces 3
...
filen

para:

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

Em seguida, basta fornecer o arquivo como um script:

$ . ./files

Um espaço e uma barra invertida podem ser adicionados a cada linha no buffer viusando :%s/$/ \\/.

Responder3

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

Responder4

Se for uma sequência normal, você pode fazer isso:

na festa:

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

ou se você tiver o utilitárioseq

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

informação relacionada