Saya meminta daftar snapshot ec2 melalui alat baris perintah ec2 amazon:
ec2-describe-snapshots -H --hide-tags > snapshots.csv
Data terlihat seperti ini:
SnapshotId VolumeId StartTime OwnerId VolumeSize Description
snap-00b66464 vol-b99a38d0 2012-01-05 5098939 160 my backup
Bagaimana saya bisa mencegat data sebelum mengarahkannya ke snapshots.csv
dan melakukan hal-hal berikut:
- ganti "tabs" dengan koma
- merangkum nilai dengan kutipan
- jika suatu nilai adalah semua angka, awali dengan nilai
=
sehingga excel akan memperlakukannya sebagai teks - misalnyaOwnerId
harus"=5098939
"(yang ini tidak perlu jika tidak dapat dilakukan inline dan sebagai gantinya akan memerlukan file skrip atau fungsi)
output yang diinginkan:
"SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description"
"snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"
Jawaban:
Dengan asumsi Anda memberi nama ini
convert.awk
, Anda dapat memanggil salah satu dari keduanyaatau (setelah menambahkan izin eksekusi,
chmod a+x convert.awk
)Ini akan membuat kolom baru untuk setiap tab, yang akan menjaga kolom komentar bersama (kecuali jika mengandung tab), tetapi menambahkan kolom kosong (meskipun itu adalah bagaimana hasil sampel Anda terlihat, jadi mungkin Anda benar-benar menginginkannya). Jika Anda ingin membagi di semua spasi putih (ini akan menciutkan tab tambahan dalam tabel tetapi menempatkan setiap kata dalam deskripsi sebagai kolom baru), keluarkan
FS="\t";
pernyataan.Untuk generasi mendatang, jika Anda tidak memerlukan spasi
"
s atau=
s atau embedded, Anda dapat menjadikannya one-liner:sumber
./convert.sh
, chmod + x, dan kemudian pipa input ke dalamnya sehingga akan mencetak output? Saya mendapatkan kesalahan:/usr/bin/awk: syntax error at source line 1 context is >>> . <<< /convert.sh
.convert.awk
untuk menunjukkan ituawk
skrip dan bukan skripbash
. Saya memperbarui posting dengan baris perintah penuh, dan perhatikan bahwa saya menambahkan-f
flag yang saya lupa ke baris pertama (yang memberitahukannya untuk mengartikan file sebagai perintah).Inilah solusi perl. Ini mungkin dilakukan dengan sed / awk, tetapi pengujian untuk bagian numerik kemungkinan akan membuatnya sangat jelek.
sumber
Jika Anda hanya malas seperti saya dan ingin melakukan semuanya pada satu baris perintah tanpa menulis skrip, inilah cara saya melakukannya.
Ini
^I
dibuat dengan menekan ctrl+ v i.Pertama
sed
swap semuatabs
untuk","
. Yang keduased
menyisipkan a"
di awal setiap baris, dan sed terakhir menyisipkan penutupan"
di akhir setiap baris.sumber
<kbd>text</kbd>
.sed -e 's/^I/","/g' -e 's/.*/"&"/'
atau bahkan lebih pendeksed -e 's/^I/","/g;s/.*/"&"/'
.Solusi Perl lainnya:
meminta dengan
ec2-describe-snapshots -H --hide-tags | /var/tmp/script.pl > output.txt
sumber
sed adalah utilitas linux paling berguna yang pernah saya temui.
Perintah pertama menggantikan semua tab di setiap baris dengan koma dan tanda kutip. Perintah kedua menyisipkan tanda kutip di awal dan akhir setiap baris, sehingga setiap nilai akan dikelilingi dalam tanda kutip, yang memungkinkan koma menjadi bagian dari nilai.
sumber
Ini mungkin bekerja untuk Anda:
sumber