Pada shell, saya pipa ke awk ketika saya membutuhkan kolom tertentu.
Ini mencetak kolom 9, misalnya:
... | awk '{print $9}'
Bagaimana cara memberi tahu awk untuk mencetak semua kolom termasuk dan setelah kolom 9 , bukan hanya kolom 9?
Pada shell, saya pipa ke awk ketika saya membutuhkan kolom tertentu.
Ini mencetak kolom 9, misalnya:
... | awk '{print $9}'
Bagaimana cara memberi tahu awk untuk mencetak semua kolom termasuk dan setelah kolom 9 , bukan hanya kolom 9?
Jawaban:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
atau perl
untuk ini. Gunakan ini hanya jika Anda benar-benar bersikeras untuk memilikinya awk
.
Ketika Anda ingin melakukan berbagai bidang, awk
tidak benar-benar memiliki cara langsung untuk melakukan ini. Saya akan merekomendasikan cut
sebagai gantinya:
cut -d' ' -f 9- ./infile
Menambahkan pembatas bidang spasi karena defaultnya adalah tab. Terima kasih kepada Glenn karena telah menunjukkan hal ini
find . | xargs ls -l | cut -d' ' -f 9-
. Untuk beberapa alasan spasi ganda juga dihitung. Contoh: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
akan menghasilkan./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Edit : Perhatikan, ini tidak berfungsi jika ada bidang sebelum yang kesembilan berisi nilai yang sama dengan yang kesembilan.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Alih-alih berurusan dengan spasi putih lebar variabel, ganti semua spasi putih sebagai spasi tunggal. Kemudian gunakan sederhana cut
dengan bidang yang diminati.
Itu tidak menggunakan awk jadi tidak erat tetapi sepertinya sesuai diberikan jawaban / komentar lain.
ps faux |
digunakan. Jangan pernah takut mengakui alat XYZ bukan yang paling tepat.
Umumnya perl menggantikan awk / sed / grep et. al., dan banyak lebih portabel (serta menjadi pisau lipat yang lebih baik).
perl -lane 'print "@F[8..$#F]"'
Timtowtdi berlaku tentu saja.
-l
, atau menambahkan \n
ke pernyataan cetak.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Ini memotong apa yang ada sebelum bidang yang diberikan nr., N, dan mencetak semua sisa baris, termasuk bidang nr.N dan mempertahankan jarak asli (tidak memformat ulang). Tidak masalah jika string bidang muncul juga di tempat lain dalam baris, yang merupakan masalah dengan jawaban Ascherer.
Tentukan fungsi:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Dan gunakan seperti ini:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Output mempertahankan semuanya, termasuk spasi tambahan Untuk N = 0 ia mengembalikan seluruh baris, sebagaimana adanya, dan untuk n> NF string kosong
Berikut adalah contoh ls -l
keluarannya:
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
Solusi saya untuk mencetak postingan apa pun $9
adalahawk '{print substr($0, 61, 50)}'
Untuk menampilkan 3 kolom pertama dan mencetak kolom lainnya, Anda dapat menggunakan:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
di mana $ 1 $ 2 $ 3 adalah 3 bidang pertama.
Menggunakan cut daripada awk dan mengatasi masalah dengan mencari tahu kolom mana untuk memulai dengan menggunakan perintah -c character cut.
Di sini saya katakan, berikan semua kecuali 49 karakter pertama dari keluaran.
ls -l /some/path/*/* | cut -c 50-
Itu /*/*/
akhir perintah ls mengatakan tunjukkan apa yang ada di subdirektori juga.
Anda juga dapat menarik rentang karakter tertentu secara (dari halaman manual yang dipotong). Misalnya, tunjukkan nama dan waktu login dari pengguna yang sedang login:
who | cut -c 1-16,26-38