Untuk memberikan konteks pada masalah saya. Saya mencoba memindahkan daftar file, di mana jika resolusinya lebih besar dari 3,00, maka pindah ke direktori, Above3.

#!/bin/bash

files=`ls *.ent`
Above3=/mnt/d/Documents/Research/PhD/PhD/Research/Results/PDB/New/XRD/Above3
for f in $files; do
        resolution=`cat $f | grep "REMARK   2 RESOLUTION." | awk '{print $4}' | tr -d ' '`
        if [ $resolution -gt 3.00 ] ; then
        mv $f $Above3
        fi
done

Kesalahan yang saya dapatkan adalah "ekspresi bilangan bulat yang diharapkan" yang saya tidak yakin bagaimana cara memperbaikinya. Setiap saran tentang solusi akan sangat dihargai.

2
Dan 25 Mei 2021, 16:43

1 menjawab

Jawaban Terbaik

3,00 adalah nilai mengambang. Bash tidak dapat memproses nilai floating point, hanya bilangan bulat, oleh karena itu pesan kesalahannya.

Anda bisa memperlakukannya sebagai string dan membandingkannya menurut abjad jika Anda bisa mendapatkan nomor Anda dalam format tetap (misalnya dengan dua digit setelah titik desimal).

Tapi saya lebih menyarankan Anda menggunakan perintah bc yang khusus dibuat untuk perhitungan:

if [ $(bc <<< "$resolution > 3.00") == 1 ] ; then
    mv $f $Above3
fi

Apa script (sebagai ringkasan):

Apa script?

  • dibutuhkan semua file yang sesuai dengan *.ent di direktori saat ini

  • dibutuhkan semua baris yang berisi "REMARK 2 RESOLUTION." dari semua file ini; dibutuhkan kata ke-4 dari baris-baris ini; dan menempatkan hasilnya ke dalam variabel bash $resolusi

  • jika $resolusi lebih besar dari 3,00 itu memindahkan file yang sesuai (salah satu file *.ent) ke dalam direktori /mnt/d/Documents/Research/PhD/PhD/Research/Results/PDB/New/XRD/Above3

  • kemudian loop untuk melanjutkan dengan file berikutnya yang namanya cocok dengan *.ent

1
Jean-Loup Sabatier 25 Mei 2021, 15:14