Bagaimana cara memilih kolom pertama dari string yang dipisahkan TAB?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Di atas akan mengembalikan keseluruhan baris dan bukan hanya "LOAD_SETTLED" seperti yang diharapkan.
Memperbarui:
Saya perlu mengubah kolom ketiga di tab nilai yang dipisahkan. Berikut ini tidak berhasil.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
Namun ini berfungsi seperti yang diharapkan jika pemisahnya koma, bukan tab.
echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt
awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt
untuk mencetak nilai tab-delimited dari tiga kolom pertama.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
variabel pengaturan. Sangat buruk untuk digunakanBEGIN {FS="\t"}
di dalam program sebaris , dan kontribusi sumber terbuka apa pun yang Anda coba buat seperti itu kemungkinan besar akan ditolak. Lakukan itu hanya jika Anda sedang menulis file program . Juga, tidak disarankan untuk menggunakan-F
daripada-v FS=
karena yang terakhir menjelaskan bahwa hanyaFS
sedang diatur dan tidakOFS
. Kebingungan tentang poin terakhir itulah yang menyebabkan posting ini di tempat pertama. Itulah mengapa "gaya yang baik" itu penting.OFS
variabel.Jawaban:
Anda perlu mengatur
OFS
variabel (pemisah bidang keluaran) menjadi tab:echo "$line" | awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
(pastikan Anda mengutip
$line
variabel dalam pernyataan echo)sumber
$
masuk$'\t'
tidak diperlukan. Greg's wiki lebih baik: "Dari ini,$'...'
adalah yang paling umum, dan bertindak seperti tanda kutip tunggal kecuali bahwa kombinasi yang diloloskan dengan garis miring terbalik diperluas sebagaimana ditentukan oleh standar ANSI C".$'\t'
itu tidak perlu. awk memahami string"\t"
sebagai karakter tabawk -F $'\t' 'BEGIN {OFS = FS} …'
. Seharusnya begituawk -v FS='\t' -v OFS='\t' '…'
. Ini mungkin tampak terlalu berlebihan, tetapi menjadi tidak konsisten meningkatkan kemungkinan kontributor nantinya akan memperkenalkan bug karena mereka salah memahami kode Anda.Pastikan mereka benar-benar tab! Di bash, Anda dapat memasukkan tab menggunakanC-v TAB
$ echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F$'\t' '{print $1}' LOAD_SETTLED
sumber
Anda dapat mengatur Pemisah Bidang:
... | awk 'BEGIN {FS="\t"}; {print $1}'
Bacaan bagus:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
sumber
Saya menggunakan variabel
FS
andOFS
untuk memanipulasi file zona BIND yang dibatasi tab. Ini adalah salah satu skrip saya https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39Dagingnya adalah:
awk -v FS='\t' -v OFS='\t' \ -v record_type=$record_type \ -v hostname=$hostname \ -v ip_address=$ip_address ' $1==hostname && $3==record_type {$4=ip_address} {print} ' $zone_file > $temp
Ini adalah cara yang bersih dan mudah dibaca untuk melakukan ini.
sumber
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'
sumber
Haruskah ini tidak berhasil?
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk '{print $1}'
sumber