file cat dalam urutan tertentu berdasarkan nomor dalam nama file

12

Saya memiliki file bernama file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Saya ingin catmereka agar file.88_1.pdbdisisipkan setelah file.88_0.pdb, file.88_2.pdbsetelah file.88_1.pdb, dan seterusnya. Jika saya melakukannya cat file.88_*.pdb > all.pdb, file-file tersebut disatukan dalam urutan berikut:, 0 1 10 11 12 13 14 15 16 17 18 19 2 20...dll. Bagaimana cara menyatukannya sehingga urutannya 0 1 2 3 4 5 6...?

sodiumnitrate
sumber
1
Ngomong-ngomong, Anda mungkin tertarik dengan situs Bioinformatika baru kami jika Anda bekerja di lapangan.
terdon

Jawaban:

24

Menggunakan brace expansion

cat file.88_{0..100}.pdb >>bigfile.pdb

Untuk mengabaikan pencetakan pesan kesalahan untuk file yang tidak ada gunakan:

cat file.88_{0..100}.pdb >>bigfile.pdb 2>/dev/null

Dalam zshshell juga Anda memiliki (n)kualifikasi globbing untuk meminta penyortiran numerik (sebagai lawan dari standar alfabet ) untuk glob:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null
αғsнιη
sumber
3
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

atau, mengenai komentar Jesse_b:

cat $(for((i=0;i<101;i++)); do test -f "file.88_${i}.pdb" && echo -n "file.88_${i}.pdb "; done)
Hauke ​​Laging
sumber
3

Dalam shell tanpa ekspansi brace, Anda dapat menggunakan ls+ xargs:

ls -v file.88_*.pdb | xargs cat > all.pdb

Ini akan mengurutkan file dalam urutan angka:

-v semacam alami nomor (versi) dalam teks.

Alexander Kovalev
sumber
2

Mencoba:

filedir="/path/to/files"
output="/path/to/all.pdb"
for file in $(find $filedir -type f -name "file.88_*" | sort -t "_" -k2 -n); do
    cat $file >> $output
done

Ini bisa sortdigunakan oleh pemisah pada -k2bidang kedua ( ) _sebagai pemisah. Di sini Anda harus menggunakan >>jika tidak setiap file baru akan menimpa yang terakhir.

jesse_b
sumber
Saya masih mendapatkan urutan yang salah:0 1 10 11 12...
sodiumnitrate
os apa yang kamu jalankan? jika Anda melakukan sort --versionapa yang Anda dapatkan? Dan Anda memiliki -nperintah semacam itu, kan?
jesse_b
OSX El Capitan,sort (GNU coreutils) 5.93
sodiumnitrate
1
Terima kasih banyak untuk mencoba! The /dev/nullSelain jawaban lain yang sangat dibutuhkan!
sodiumnitrate
1
Penggunaan substitusi perintah yang tidak berguna . Gunakan sesuatu seperti find ... | sort ... | xargs cat >> $outputsebagai gantinya.
David Foerster