Например: в моем каталоге /temp у меня есть 100 файлов .. 50 с расширением .msg и 50 с .xml.

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

а также

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

В текстовом файле я хотел бы вывести комбинацию содержимого файлов .xml и .msg один за другим. Например, выходной файл должен выглядеть так:

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

в этом каталоге /temp всегда будет одинаковое количество файлов .msg и .xml. Дополнительно можно будет показать путь или имя файла перед содержимым в выходном файле? например:

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

Я пробовал простой канал в файл

cat * > text.txt

но это не дает требуемого результата. В выходном файле сначала перечисляется содержимое всех файлов * .xml, а затем файлов * .msg.

Пожалуйста помогите.

5 ответов5

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

Может работать для вас, если вы используете оболочку bash . В противном случае (другие оболочки POSIX) используйте: cat "$f" "${f%.xml}.msg" вместо приведенной выше строки cat .

1

В таких ситуациях часто имеет смысл действовать следующим образом:

  1. Перечислите все файлы в текстовый файл:

    $ ls > files
    
  2. Отредактируйте текстовый файл, чтобы удалить ненужные файлы и расположить остальные в точном порядке, который вы хотите.

  3. Затем просто сделайте это (при условии, что ни один из файлов не имеет пробелов или забавных символов в именах):

    $ cat $(cat files) > bigfile
    

Разновидностью этого подхода является преобразование текстового файла в одну большую команду из

file1
file2
file with spaces 3
...
filen

чтобы:

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

Затем просто отправьте файл как скрипт:

$ . ./files

Пробел и обратную косую черту можно добавить к каждой строке в буфере в vi используя :%s/$/ \\/ .

0
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
0

Это похоже на работу:

ls test* | awk -F. 'NR%2==0 {printf("echo %s.msg:; cat %s.msg\necho %s.xml:; cat %s.xml\n",$1,$1,$1,$1)}' | sh
0

Если это нормальная последовательность, вы можете сделать это:

в bash:

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

или если у вас есть утилита seq

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .