Saya mencoba untuk menghapus dua kolom pertama (yang saya tidak tertarik) dari file log DbgView. Saya tidak bisa menemukan contoh yang dicetak dari kolom 3 dan seterusnya sampai akhir baris. Perhatikan bahwa setiap baris memiliki jumlah kolom yang bervariasi.
linux
shell
unix
multiple-columns
Amit G
sumber
sumber
Jawaban:
... atau solusi yang lebih sederhana:
cut -f 3- INPUTFILE
cukup tambahkan pembatas yang benar (-d) dan Anda mendapatkan efek yang sama.sumber
sumber
awk '{for(i=3;i<=NF;++i)printf $i""FS ; print ""}'
(printf
tidak akan mencetak karakter baris baru sementaraprint ""
akan menambahkan baris baru setelah bidang lain telah dicetak)echo $(seq 1 10) | awk '{for (i=3; i<=NF; i++) printf $i FS}'
, yang memberikan:3 4 5 6 7 8 9 10
.solusi ditemukan di sini:
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
sumber
Jawaban Jonathan Feinberg mencetak setiap bidang pada baris terpisah. Anda dapat menggunakan
printf
untuk membangun kembali rekaman untuk keluaran pada baris yang sama, tetapi Anda juga dapat memindahkan bidang dengan lompatan ke kiri.sumber
NF
tidak diperbolehkan oleh POSIX.NF
dapat dikurangi.NB: metode ini akan membiarkan "kosong" di 1,2,3 bidang tetapi tidak menjadi masalah jika Anda hanya ingin melihat keluaran.
sumber
1
? dengan kata kunci apa saya harus mencariawk
?{$1=$2=$3="";$0=$0;$1=$1}1
Jika Anda ingin mencetak kolom setelah tanggal 3 misalnya di baris yang sama, Anda dapat menggunakan:
Sebagai contoh:
Ini akan mencetak:
Seperti yang bisa kita lihat, slip gaji bahkan dengan spasi, ditampilkan di baris yang benar.
sumber
Bagaimana dengan baris berikut:
Berdasarkan saran @ ghostdog74. Milik saya harus berperilaku lebih baik saat Anda memfilter garis, yaitu:
sumber
sed 's/\s\+//g'
di akhir perintah untuk memangkas spasi utamaIni 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 daisaa.
Tentukan fungsi:
Dan gunakan seperti ini:
Output mempertahankan segalanya, termasuk spasi tambahan
Berfungsi dengan baik untuk file di mana '/ n' adalah pemisah record sehingga Anda tidak memiliki karakter baris baru di dalam baris. Jika Anda ingin menggunakannya dengan pemisah rekaman lain, gunakan:
sebagai contoh. Bekerja dengan baik dengan hampir semua file selama tidak menggunakan karakter heksadesimal. 1 di dalam garis.
sumber
Perintah awk berikut mencetak bidang N terakhir dari setiap baris dan di akhir baris mencetak karakter baris baru:
Temukan di bawah contoh yang mencantumkan konten direktori / usr / bin dan kemudian menyimpan 3 baris terakhir dan kemudian mencetak 4 kolom terakhir dari setiap baris menggunakan awk:
sumber
Pertama, Anda menemukan posisi awal kolom ketiga. Dengan substr Anda akan mencetak seluruh baris ($ 0) mulai dari posisi (dalam hal ini a) sampai akhir baris.
sumber
Nah, Anda dapat dengan mudah mencapai efek yang sama menggunakan ekspresi reguler. Dengan asumsi pemisah adalah spasi, ini akan terlihat seperti:
sumber
awk '{ sub(/([^ ]+ +){2}/, ""); print }'
yang menghilangkan pola dua kali.sumber
Solusi Perl:
Opsi baris perintah ini digunakan:
-n
memutar di sekitar setiap baris file input, jangan mencetak setiap baris secara otomatis-l
menghapus baris baru sebelum diproses, dan menambahkannya kembali setelahnya-a
mode autosplit - memisahkan baris input ke dalam larik @F. Secara default, pemisahan di spasi kosong-e
jalankan kode perlsplice @F,0,2
menghapus kolom 0 dan 1 dengan rapi dari larik @Fjoin " ",@F
menggabungkan elemen dari larik @F, menggunakan spasi di antara setiap elemenJika file masukan Anda dipisahkan dengan koma, bukan dipisahkan spasi, gunakan
-F, -lane
Solusi Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
sumber
Agak terlambat di sini, tetapi semua cara di atas sepertinya tidak berhasil. Coba ini, menggunakan printf, sisipkan spasi di antara masing-masing. Saya memilih untuk tidak memiliki baris baru di akhir.
sumber
mencetak rekaman mulai dari bidang ke-4 hingga bidang terakhir dengan urutan yang sama seperti di file aslinya
sumber
Di Bash Anda dapat menggunakan sintaks berikut dengan parameter posisi:
Pelajari lebih lanjut: Menangani parameter posisi di Bash Hackers Wiki
sumber
Jika ini hanya tentang mengabaikan dua bidang pertama dan jika Anda tidak menginginkan spasi saat menutupi bidang tersebut (seperti yang dilakukan beberapa jawaban di atas):
sumber
Dua kolom pertama dikosongkan,
sed
menghapus spasi terdepan.sumber
Dalam kolom AWK disebut field, maka NF adalah kuncinya
semua baris:
hanya baris pertama:
sumber