UNIX: Menggabungkan file dengan ekstensi berbeda ke satu file

0

Sebagai contoh: Di direktori / temp saya, saya punya 100 file .. 50 dengan ekstensi .msg dan 50 dengan .xml.

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

dan

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

Dalam file teks, saya ingin menampilkan kombinasi konten file .xml dan .msg satu demi satu. Misalnya file output akan terlihat seperti:

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

dalam direktori / temp ini akan selalu ada jumlah file .msg dan .xml yang sama. Selain itu, mungkinkah untuk menunjukkan path atau nama file sebelum konten dalam file output? sebagai contoh:

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

Saya telah mencoba pipa sederhana ke file

cat * > text.txt

tetapi ini tidak memberikan hasil yang diperlukan. Dalam file output, pertama-tama daftar konten semua file * .xml kemudian file *.

Tolong bantu.


sumber
Ini akan lebih baik ditanyakan unix.stackexchange.com
sashoalm
2
Tidak ada alasan mengapa pertanyaan pemrograman shell tidak dapat ditanyakan pada SO.
Jonathan Leffler
Saya bisa melihat daftar file pesan sebelum file XML untuk setiap pasangan, tapi saya benar-benar tidak tahu caranya cat * dapat mendaftar semua file XML sebelum semua file pesan. Dapatkah Anda menguraikan itu? (Juga, milikmu cat perintah tidak memiliki pipa apa pun; hanya menggunakan pengalihan I / O.)
Jonathan Leffler
Permintaan maaf .. tidak ada gunanya pipa. ketika saya menjalankan perintah 'cat *' itu memberi saya semua .xml dan kemudian file .msg di file output. Ini mungkin karena caranya ada di direktori / temp

Jawaban:

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

Mungkin berfungsi untuk Anda, jika Anda menggunakan bash kulit. Kalau tidak (kerang POSIX lainnya) gunakan: cat "$f" "${f%.xml}.msg" bukannya yang di atas cat baris.

Zsolt Botykai
sumber
ketika saya menjalankan skrip dengan yang di atas saya mendapatkan './testScript[3]: $ {f / .xml / .msg}: substitusi buruk'
1
Pesan kesalahan menunjukkan Anda tidak menggunakan Bash. Coba sesuatu seperti cat "$f" "$(basename "$f" .xml).msg") sebagai gantinya.
tripleee
@ tripleee benar, Anda mendapatkan kesalahan itu, karena shell yang digunakan.
Zsolt Botykai
4
${f%.xml}.msg harus bekerja di setiap shell POSIX ( ${f/.xml/.msg} adalah bash aliran).
chepner
1

Dalam situasi seperti ini, sering masuk akal untuk melanjutkan sebagai berikut:

  1. Daftar semua file ke dalam file teks:

    $ ls > files
    
  2. Edit file teks, untuk menghapus file yang tidak diinginkan dan untuk mengatur yang tersisa ke dalam urutan yang Anda inginkan.

  3. Maka lakukan saja ini (dengan asumsi tidak ada file yang memiliki spasi atau karakter lucu dalam namanya):

    $ cat $(cat files) > bigfile
    

Variasi pada pendekatan ini adalah mengubah file teks menjadi satu perintah besar, dari

file1
file2
file with spaces 3
...
filen

untuk:

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

Kemudian cukup sumber file sebagai skrip:

$ . ./files

Spasi dan garis miring terbalik dapat ditambahkan ke setiap baris di buffer vi menggunakan :%s/$/ \\/.

Kaz
sumber
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
rein
sumber
Itu {1..50} ekspresi juga Bashisme.
tripleee
0

Ini sepertinya berhasil:

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
Philip Kearns
sumber
0

Jika urutannya normal, Anda dapat melakukan ini:

dalam bash:

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

atau jika Anda memiliki utilitas seq

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