Saya memiliki file teks yang dipisah seperti ini:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Setiap kolom ini akan menjadi parameter untuk suatu program, dan saya ingin program dipanggil untuk setiap baris
Saya berharap untuk loop, seperti:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Apa cara terbaik untuk mencapai sesuatu seperti ini di bash?
bash
text-processing
scripting
csv
Dekan
sumber
sumber
Jawaban:
Ini harus berfungsi jika jumlah bidang konstan. Alih-alih
echo
menggunakan perintah Anda.sumber
Anda harus menggunakan a
while
denganread
built-in:Bagaimana ini bekerja?
cut
Pernyataan mengambil garis dan membagi pada pembatas yang ditentukan oleh-d
.--output-delimiter
adalah karakter pemisah yangcut
akan digunakan untuk menampilkan bidang yang dipilih, di sini kita memilih spasi sehingga kita dapat menempatkan bidang yang berbeda ke dalam arrayfields
.-f1-
ikut bermain.fields
, Anda dapat mengakses bidang tertentu yang Anda inginkan dengan sintaks di${field[number]}
mananumber
satu kurang dari jumlah bidang sebenarnya yang Anda inginkan karena pengindeksan array berbasis nol di Bash.Catatan
Untuk jumlah bidang yang konstan
Anda bisa melakukan sesuatu yang mirip dengan jawaban 1_CR :
Di atas, meskipun tampak lebih berisik, harus bekerja di shell yang sesuai dengan POSIX, bukan hanya Bash.
sumber
IFS
ke nilai yang sesuai dalamread
doaAnda bisa
read
membagi setiap baris menjadi larik,
dengan mengatur secaraIFS
tepat.Jadi, dalam contoh di atas, Anda dapat mengakses setiap elemen array menggunakan indeksnya, mulai 0.
sumber
Ini
awk
satu-kapal akan melakukan apa yang Anda inginkan:Ganti
echo
dengan perintah Anda danf.txt
dengan file yang ingin Anda ulangi.Penjelasan singkat:
-F,
akan ditetapkan,
sebagai pembatas.cmd
membangun perintah dansystem(cmd)
memanggil perintah.sumber
gnu sed dapat digunakan juga.
perhatikan penggunaan opsi e pada perintah s
sumber