Saya memiliki skrip s1
yang menampilkan daftar angka yang dipisahkan dengan ',' misalnya 1,2,3,4
. Sekarang saya ingin memberikan angka-angka ini ke skrip s2
sebagai argumen, sehingga s2 akan dijalankan pada masing-masing dan menampilkan hasilnya dalam baris terpisah. Misalnya, jika s2 mengalikan angka dengan dua, ini akan menjadi hasil yang saya cari:
2
4
6
8
Yang saya lakukan sekarang adalah:
s1 | xargs -d "," | xargs -n1 s2
Tapi aku merasa seperti melakukannya dengan cara bodoh! Jadi pertanyaan saya adalah:
Apa cara yang tepat untuk melakukannya?
Masalah saya dengan solusi saya adalah memanggil xargs dua kali dan mengulangi input dua kali yang tentu saja tidak masuk akal bagi saya melalui kinerja! Jawabannya xargs -d "," -n1
kelihatannya bagus, tapi saya tidak yakin apakah itu hanya dilakukan satu kali. Jika ya, harap verifikasi itu dalam jawaban Anda, dan saya akan menerimanya. By the way, saya lebih suka tidak menggunakan Perl karena masih iterasi dua kali dan juga Perl mungkin tidak ada pada banyak sistem.
s1 | xargs -d "," -n1 s2
Jawaban:
Ini harus bekerja sama baiknya:
Kasus cobaan:
Hasil:
Jika
s1
menampilkan daftar yang diikuti oleh karakter baris baru, Anda ingin menghapusnya karena jika tidak panggilan terakhir akan dengan4\n
bukannya4
:sumber
Jika
s2
dapat menerima beberapa argumen, Anda bisa melakukan:yang sementara mengesampingkan IFS menjadi koma, semua dalam subkulit, sehingga
s2
melihat outputs1
dipecah oleh koma. Subshell adalah cara mudah untuk mengubah IFS tanpa menyimpan nilai sebelumnya atau meresetnya.Versi sebelumnya dari jawaban ini salah, mungkin karena pengaturan IFS yang tersisa, merusak hasil. Terima kasih kepada ilkkachu karena menunjukkan kesalahan saya .
Untuk secara manual mengulang output dan menyediakannya secara individual
s2
, di sini menunjukkan penghematan & pengaturan ulang IFS:atau jalankan bit IFS dalam subkulit seperti sebelumnya:
sumber
bash -c 'IFS=, printf "%s\n" $(echo 1,2,3)'
mencetak1,2,3
pada sistem saya, yaitu tidak ada pemisahan./usr/bin/printf
dan/bin/echo
(IFS=,; printf "%s\n" $(echo 1,2,3))
, di sisi lain, harus berfungsi.Coba ini:
sumber
tr ',' '\n'
? Tidak perlu memanggil sesuatu yang (relatif) seberat Perl dan ekspresi reguler.