Saya memiliki file yang menyertakan detail tentang VM yang berjalan di hypervisor. Kami menjalankan beberapa perintah dan mengarahkan output ke file. Dan data tersedia dalam format di bawah ini.
Virtual Machine : OL6U5
ID : 0004fb00000600003da8ce6948c441bb
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U6
ID : 0004fb00000600003da8ce6948c441bc
Status : Running
Memory : 65536
Uptime : 17565 Minutes
Server : MyOVS2.vmorld.com
Pool : NON-HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U7
ID : 0004fb00000600003da8ce6948c441bd
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Output ini berbeda dari hypervisor ke hypervisor karena pada beberapa hypervisor kami memiliki 50+ vms berjalan. File di atas hanyalah sebuah contoh dari hypervisor di mana kami hanya menjalankan 3 VM dan karenanya file yang dialihkan diharapkan berisi informasi tentang beberapa (sejumlah N VM)
Kita perlu mendapatkan detail ini dalam format di bawah ini menggunakan awk / sed atau dengan skrip shell
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U5 0004fb00000600003da8ce6948c441bb Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U6 0004fb00000600003da8ce6948c441bc Running 65536 17565 MyOVS2.vmworld.com NON-HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U5 0004fb00000600003da8ce6948c441bd Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
text-processing
sed
awk
IgniteLX
sumber
sumber
Jawaban:
Jika berjalan file dua kali bukan masalah (besar) (hanya akan menyimpan satu baris dalam memori):
Yang, untuk hitungan bidang umum akan (yang bisa memiliki banyak lapisan file):
Tetapi untuk transpos yang benar-benar umum, ini akan bekerja:
Dan untuk membuatnya cantik (menggunakan tab
\t
sebagai pemisah bidang):Kode di atas untuk transpose umum akan menyimpan seluruh matriks dalam memori.
Itu bisa menjadi masalah untuk file yang sangat besar.
Perbarui untuk teks baru.
Untuk memproses teks baru yang diposting dalam pertanyaan itu, bagi saya tampaknya dua lulus awk adalah jawaban terbaik. Satu pass, sesingkat field yang ada, akan mencetak judul field header. Awk pass berikutnya hanya akan mencetak bidang 2. Dalam kedua kasus, saya menambahkan cara untuk menghapus spasi awal dan akhir (untuk pemformatan yang lebih baik).
Sekitarnya
{ ... } | column -t -s "$(printf '%b' '\t')"
adalah untuk memformat seluruh tabel dengan cara yang cantik.Harap dicatat bahwa
"$(printf '%b' '\t')"
bisa diganti dengan$'\t'
di ksh, bash, atau zsh.sumber
Jika Anda memiliki
rs
utilitas (membentuk kembali) yang tersedia, Anda dapat melakukan hal berikut:Ini memberikan format output persis seperti yang ditentukan dalam pertanyaan, bahkan hingga lebar kolom dinamis.
-T
Transpos data input-z
ukuran kolom dengan tepat dari maks di setiap kolom-c:
menggunakan titik dua sebagai pemisah bidang inputIni berfungsi untuk tabel berukuran sewenang-wenang, misalnya:
rs
tersedia secara default pada OS X (dan kemungkinan mesin BSD lainnya). Itu dapat diinstal di Ubuntu (dan keluarga debian) dengan:sumber
EDIT: Dapat diperluas ke sejumlah baris output, dalam satu
for
lingkaran sederhana:Jawaban asli:
Anda bisa melakukan ini sebagai satu-liner menggunakan
bash
subtitusi proses:The
-s
pilihan untukpaste
merek itu menangani setiap satu file pada satu waktu. The:
pembatas ditetapkan dalampaste
adalah "tertangkap" oleh-s
pilihan untukcolumn
di akhir, untuk cukup sampai format dengan membuat bidang berbaris.The
cut
perintah dalam dua substitusi proses menarik keluar field pertama dan kolom kedua, masing-masing.Apakah ada garis kosong di input atau tidak, tidak masalah, karena
column -t -s:
akan membersihkan output terlepas. (Ada baris kosong di input asli yang ditentukan dalam pertanyaan, tetapi sejak itu telah dihapus. Perintah di atas berfungsi terlepas dari baris kosong.)Input - isi file bernama "input" pada perintah di atas:
Keluaran:
sumber
Menggunakan awk, simpan kunci dan nilai dan cetak pada akhirnya.
Yang baru saja lari
awk -f ./script.awk ./input.txt
sumber
sumber
Dengan
gnu datamash
dancolumn
dariutil-linux
:Ini berfungsi dengan lebih dari dua kolom tetapi mengasumsikan tidak ada baris kosong di file input Anda; dengan baris kosong di antara (seperti pada sampel input awal Anda), Anda akan mendapatkan kesalahan seperti:
jadi untuk menghindari itu Anda harus memerasnya sebelum diproses dengan
datamash
:Kalau tidak, dalam kasus khusus ini (hanya dua kolom), dengan
zsh
dan yang samacolumn
:(${(f)"$(<infile)"})
membaca baris dalam array;${(j;:;)list[@]%:*}
bergabung (dengan:
) bidang pertama dari setiap elemen dan${(j;:;)list[@]#*:}
bergabung (lagi dengan:
) bidang kedua dari setiap elemen; keduanya dicetak, misalnya hasilnyayang kemudian disalurkan ke
column -t -s:
sumber
cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t
Jumlah baris per Mesin Virtual hardcoded dalam kasus ini - 11. Akan lebih baik menghitungnya terlebih dahulu dan menyimpannya ke dalam variabel, kemudian gunakan variabel ini dalam kode.
Penjelasan
cat <(command 1) <(command 2)
-<()
konstruksi membuatcommand
output muncul seperti file sementara. Oleh karena itu,cat
gabungkan dua file dan pipa itu lebih lanjut.head -n 11 virtual.txt | cut -d: -f1
, memberi kita header kolom masa depan. Entri satu Mesin Virtual adalah sebelas baris pertama,head
perintah digunakan untuk mendapatkannya. Thecut
membagi entri ini ke dua kolom dan mencetak satu-satunya pertama.sed 's/.*: //' virtual.txt
- memberi kita nilai kolom di masa mendatang.sed
menghapus semua teks yang tidak dibutuhkan dan hanya menyisakan nilai.xargs -d '\n' -n 11
. Setiap item input diakhiri oleh baris baru. Perintah ini mendapat item dan mencetaknya dengan 11 per baris.column -t
- diperlukan untuk tampilan pencetakan yang cantik. Ini menampilkan garis kami dalam bentuk tabel. Jika tidak, setiap baris akan memiliki lebar yang berbeda.Keluaran
sumber
Gunakan
datamash
dantranspose
pilihannya untuk menukar baris dan kolom dalam file.Secara default, transpos memverifikasi input memiliki jumlah bidang yang sama di setiap baris, dan gagal dengan kesalahan sebaliknya dan Anda dapat menonaktifkan mode ketat untuk memungkinkan nilai yang hilang oleh
--no-strict
Anda juga dapat menggunakan
--filler
untuk mengatur nilai pengisi bidang yang hilang:berasal dari
datamash manual
sumber
jika data Anda berada di file terpisah di direktori, Anda dapat menggunakan:
Anda mungkin perlu memijat jumlah
\t
karakter (tab) diprintf
telepon jika nilai variabel Anda memiliki panjang yang berbeda.sumber