Saya tahu cara menggabungkan hasil dari perintah yang berbeda
paste -t',' <(commanda) <(commandb)
Saya tahu input pipa yang sama untuk perintah yang berbeda
cat myfile | tee >(commanda) >(commandb)
Sekarang bagaimana cara menggabungkan perintah ini? Sehingga saya bisa melakukannya
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Katakanlah saya punya file
file saya:
1
2
3
4
Saya ingin membuat file baru
1 4 2
2 3 4
3 2 6
4 1 8
Saya menggunakan
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
akan memberi saya hasil secara vertikal, di mana saya benar-benar ingin menempelkannya dalam urutan horizontal.
bash
shell-script
text-processing
pipe
process-substitution
pengguna40129
sumber
sumber
Jawaban:
Saat Anda memilih beberapa proses penggantian, Anda tidak dijamin mendapatkan output dalam urutan tertentu, jadi sebaiknya Anda tetap menggunakannya
Dengan asumsi
cat myfile
singkatan dari beberapa pipeline mahal, saya pikir Anda harus menyimpan output, baik dalam file atau variabel:Menggunakan contoh Anda:
Pikiran lain: FIFO, dan satu saluran pipa
sumber
The
yash
shell memiliki fitur unik ( pipa redirection dan proses pengalihan ) yang membuat lebih mudah ada:3>>|4
( pengalihan pipa ) menciptakan pipa di mana ujung penulisan pada fd 3 dan ujung membaca pada fd 4.3>(commanda>&3)
adalah redirection proses , sedikit seperti substitusi proses ksh / zsh / bash tetapi hanya redirection dan tidak menggantikan dengan/dev/fd/n
.ksh
's>(cmd)
kurang lebih sama denganyash
' sn>(cmd) /dev/fd/n
(adan
sebuah file descriptor yang dipilih olehksh
di mana Anda tidak memiliki kontrol).sumber
Dengan
zsh
:Kemudian gunakan sebagai:
Itu diadaptasi dari pertanyaan lain ini di mana Anda akan menemukan beberapa penjelasan terperinci dan petunjuk tentang keterbatasannya (waspadalah terhadap deadlock!).
sumber
Untuk contoh khusus Anda seharusnya tidak perlu
paste
dan sisanya. Seringkali benar bahwa ketika kita menemukan batas dengan perangkat standar itu karena apa yang ingin kita lakukan dengan satu cara dapat dilakukan dengan cara lain. Seperti:... yang mencetak ...
Anda bisa mendapatkan file dengan konten seperti yang Anda sebutkan ke dalam
"$@"
array shell Anda seperti ...Dan untuk memvalidasi nilai-nilai arg dalam satu loop seperti yang di atas, Anda dapat mengubah tes awal sedikit ...
... yang mencetak kesalahan ke stderr hanya jika suatu baris yang dibacakan
set -- $(cat)
mengandung baris yang tidak seluruhnya terdiri dari satu bilangan bulat.sumber