Saya mencoba untuk mengekstrak bidang (keempat) tertentu dari aliran teks yang disesuaikan dengan spasi, yang disesuaikan dengan kolom. Saya mencoba menggunakan cut
perintah dengan cara berikut:
cat text.txt | cut -d " " -f 4
Sayangnya, cut
tidak memperlakukan beberapa ruang sebagai satu pembatas. Saya bisa menyalurkan melalui awk
awk '{ printf $4; }'
atau sed
sed -E "s/[[:space:]]+/ /g"
untuk meruntuhkan ruang, tapi saya ingin tahu apakah ada cara untuk menangani cut
dan beberapa pembatas secara asli?
Jawaban:
Mencoba:
Dari
tr
halaman manual:sumber
cat
sini. Anda dapat mengirim< text.txt
langsung ketr
. en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat-d
dan menerjemahkan langsung dari beberapa karakter ke tab. Sebagai contoh: Saya datang ke sini mencari cara untuk secara otomatis mengekspor tampilan saya:who am i | tr -s ' ()' '\t' | cut -f5
echo "a b c" | cut -d " " -f2-
,echo "a b c" | tr -s " " | cut -d " " -f2-
Saat Anda mengomentari pertanyaan Anda,
awk
ini benar-benar cara yang harus ditempuh. Untuk menggunakancut
dimungkinkan bersama dengantr -s
menekan spasi, seperti yang ditunjukkan oleh kev .Namun, biarkan saya membaca semua kombinasi yang mungkin untuk pembaca di masa mendatang. Penjelasan ada di bagian Uji.
tr | memotong
awk
pesta
sed
Tes
Diberikan file ini, mari kita coba perintah:
tr | memotong
awk
pesta
Ini membaca bidang secara berurutan. Dengan menggunakan
_
kami menunjukkan bahwa ini adalah variabel yang dapat dibuang sebagai "variabel sampah" untuk mengabaikan bidang ini. Dengan cara ini, kami menyimpan$myfield
sebagai bidang ke-4 dalam file, tidak peduli ruang di antaranya.sed
Ini menangkap tiga kelompok ruang dan tidak ada ruang dengan
([^ ]*[ ]*){3}
. Kemudian, ia menangkap apa pun yang datang sampai ruang sebagai bidang ke-4, yang akhirnya dicetak bersama\1
.sumber
awk
tidak hanya elegan dan sederhana, itu juga termasuk dalam VMware ESXi, di manatr
hilang.awk
!read
perintah, jika kita tidak peduli apa yang masuk ke dalamnya . Itu bisa apa saja, hanya saja entah bagaimana itu menjadi standar alih-alihjunk_var
atauwhatever
:)solusi terpendek / ramah
Setelah menjadi frustrasi dengan terlalu banyak keterbatasan
cut
, saya menulis pengganti saya sendiri, yang saya sebutcuts
"cut on steroids".pemotongan memberikan apa yang kemungkinan merupakan solusi paling minimalis untuk masalah ini dan banyak masalah terkait lainnya
Satu contoh, dari banyak, menjawab pertanyaan khusus ini:
cuts
mendukung:paste
secara terpisah)dan banyak lagi. Tidak ada yang disediakan oleh standar
cut
.Lihat juga: https://stackoverflow.com/a/24543231/1296044
Sumber dan dokumentasi (perangkat lunak gratis): http://arielf.github.io/cuts/
sumber
Perl one-liner ini menunjukkan seberapa dekat Perl terkait dengan awk:
Namun,
@F
larik autosplit dimulai pada indeks$F[0]
sementara bidang awk mulai dengan$1
sumber
Dengan versi yang
cut
saya tahu, tidak, ini tidak mungkin.cut
terutama berguna untuk mem-parsing file di mana pemisah tidak spasi putih (misalnya/etc/passwd
) dan yang memiliki jumlah bidang tetap. Dua pemisah dalam satu baris berarti bidang kosong, dan itu berlaku juga untuk spasi putih.sumber