Saya ingin mencetak baris bernomor ganjil dan genap dari file.
Saya menemukan skrip shell yang menggunakan gema.
#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
file=$1
counter=0
eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name
if [ $# -eq 0 ]
then
echo "$(basename $0) file"
exit 1
fi
if [ ! -f $file ]
then
echo "$file not a file"
exit 2
fi
while read line
do
# find out odd or even line number
isEvenNo=$( expr $counter % 2 )
if [ $isEvenNo -ne 0 ]
then
# even match
echo $line >> $eout
else
# odd match
echo $line >> $oout
fi
# increase counter by 1
(( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"
Tetapi apakah tidak ada cara untuk melakukannya dalam satu baris?
Ya, gunakan awk, saya baca.
Baris genap:
awk 'NR % 2' filename
garis ganjil:
awk 'NR % 2 == 1' filename
Tetapi itu tidak berhasil untuk saya. Keduanya menghasilkan output yang sama, menurut diff. Jika dibandingkan dengan file asli, mereka berdua memang setengah panjang, dan mereka berdua berisi baris bernomor ganjil. Apakah saya melakukan sesuatu yang salah?
text-processing
sed
awk
ixtmixilix
sumber
sumber
NR % 2 == 0
, kalau tidak setara dengan yang kedua.Jawaban:
Saat Anda bertanya "dalam satu baris":
Perhatikan bahwa sebagian besar kode disebabkan oleh pilihan nama file keluaran mewah Anda. Kalau tidak, kode berikut akan cukup untuk menempatkan garis ganjil di "line-1" dan bahkan garis di "line-0":
sumber
Saya lebih suka POSIX yang kompatibel, jika memungkinkan, jadi saya pikir saya akan memposting metode alternatif ini. Saya sering menggunakan ini untuk memotong teks, sebelum
xargs
saluran pipa.Cetak Garis Bernomor,
Cetak Garis Ganjil,
Meskipun saya sering menggunakan
awk
, itu berlebihan untuk jenis tugas ini.sumber
Itu mudah:
akan mencetak garis bernomor genap dari nama file
akan mencetak garis bernomor ganjil.
sumber
awk
, secara pribadi saya sangat sering menggunakannya. Saya tidak pernah mengatakan sesuatu tentang 'Bukan POSIX'awk
, saya merujuk pada opsi jawabansed
. Khususnya~
operator, ini adalah ekstensi GNU, yang masih dapat diterima oleh banyak orang. Mengenai 'menggunakan AWK secara luar, I personally believe using
biasa' untuk tugas sederhana ini terlalu banyak. Jadi +1 adalah untuk menyelesaikan tugas dengansed
, utilitas yang lebih ringan daripadaawk
.Untuk angka genap kode harus
& untuk angka ganjil
sumber
gawk 'FS=",";NF%2==0' file.csv
.Anda dapat melakukannya dengan satu
sed
permohonan, tidak perlu membaca file dua kali:atau, jika Anda lebih suka dalam satu baris:
Perhatikan bahwa ini tidak akan memberikan hasil yang diharapkan jika file hanya berisi satu baris (baris akan ditulis
w
ulangeven
bukanodd
sebagai yang pertaman
tidak dieksekusi). Untuk menghindarinya, tambahkan syarat:Bagaimana itu bekerja ? Nah, ini menggunakan tiga
sed
perintah:n
- jika tidak pada baris terakhir cetak ruang pola kestdout
(yang diarahkan ke fileodd
), ganti dengan baris berikutnya (jadi sekarang sedang memproses garis genap) dan terus menjalankan perintah yang tersisaw
- tambahkan ruang pola untuk fileeven
d
- hapus ruang pola saat ini dan mulai ulang siklus - efek sampingnya adalahsed
tidak akan pernah mencetak ruang pola secara otomatis karena tidak pernah mencapai akhir skripDengan kata lain,
n
dieksekusi hanya pada garis ganjil danw
dand
dieksekusi hanya pada garis genap.sed
tidak pernah mendapatkan autoprint kecuali, seperti yang saya katakan, input terdiri dari satu baris.sumber
Coba ini:
sumber
Saya akan pergi
perl
karena saya sukaperl
:Menggunakan fakta yang
-p
secara implisit mencetak, untuk mereplikasi carased
kerjanya - dan kami gunakanselect
untuk memilih file yang ditangani.sumber