Saya memiliki aplikasi yang akan menghasilkan sejumlah besar data yang tidak ingin saya simpan ke disk. Sebagian besar aplikasi mengeluarkan data yang tidak ingin saya gunakan, tetapi satu set informasi berguna yang harus dipisah menjadi file yang terpisah. Misalnya, diberikan output berikut:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Saya bisa menjalankan aplikasi tiga kali seperti ini:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Ini akan memberi saya apa yang saya inginkan, tetapi itu akan memakan waktu terlalu lama. Saya juga tidak ingin membuang semua output ke satu file dan menguraikannya.
Apakah ada cara untuk menggabungkan tiga operasi yang ditunjukkan di atas sedemikian rupa sehingga saya hanya perlu menjalankan aplikasi sekali dan masih mendapatkan tiga file output terpisah?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Anda dapat gunakan
awk
sumber
Anda juga bisa menggunakan kemampuan pencocokan pola shell Anda :
Atau bahkan:
Cara yang lebih aman yang dapat menangani garis miring terbalik dan garis dimulai dengan
-
:Seperti yang ditunjukkan @StephaneChazelas dalam komentar, ini tidak terlalu efisien. Solusi terbaik mungkin adalah @ AurélienOoms ' .
sumber
-n
,-e
... Itu juga akan sangat tidak efisien karena itu berarti beberapa panggilan sistem per baris (saturead(2)
per karakter, file terbuka, menulis ditutup untuk setiap baris ...). Secara umum, menggunakanwhile read
loop untuk memproses teks dalam shell adalah praktik yang buruk.-n
lain - lain sekarang. Sejauh yang saya tahu kedua versi bekerja OK dengan kosong, apakah saya salah?printf
adalah format. Tidak ada alasan untuk membuat Anda variabel tidak dikutip di sana.Jika Anda memiliki banyak inti dan Anda ingin prosesnya paralel, Anda dapat melakukan:
Ini akan menelurkan tiga proses dalam inti paralel. Jika Anda ingin ada output ke konsol, atau file master, itu memiliki keuntungan menjaga output dalam urutan tertentu, daripada mencampurnya.
Paralel utilitas gnu dari Ole Tange dapat diperoleh dari sebagian besar repo dengan nama paralel atau lebih . Sumber dapat diperoleh dari Savannah.gnu.org . Juga ada video pengajaran pengantar di sini .
Tambahan
Menggunakan versi paralel yang lebih baru (tidak harus versi dalam repo distribusi Anda), Anda dapat menggunakan konstruk yang lebih elegan:
Yang mencapai hasil menjalankan satu ./app dan 3 proses grep paralel dalam inti atau utas yang terpisah (sebagaimana ditentukan oleh paralel itu sendiri, juga menganggap -j3 sebagai opsional, tetapi diberikan dalam contoh ini untuk tujuan instruktif).
Versi paralel yang lebih baru dapat diperoleh dengan melakukan:
Kemudian, buka paket yang biasa, cd ke parallel- {date}, ./configure && make, sudo make install. Ini akan menginstal parallel, man page parallel dan man page parallel_tutorial.
sumber
Inilah satu di Perl:
sumber
... jika
<in
dapat dibaca, ketiga outfiles akan dipotong sebelum sesuatu dituliskan kepada mereka.sumber