Bagaimana cara mengganti konten kolom tertentu dengan awk?


31

Diberikan: ada 40 kolom dalam catatan. Saya ingin mengganti kolom ke-35 sehingga kolom ke-35 akan diganti dengan isi kolom ke-35 dan simbol "$". Apa yang terlintas dalam pikiran adalah sesuatu seperti:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

Ini bekerja tetapi karena tidak layak ketika jumlah kolom sebesar 10k. Saya perlu cara yang lebih baik untuk melakukan ini.

Jawaban:



8

Mungkin ada cara yang lebih efisien untuk melakukan ini. Dengan peringatan itu:

awk '{$35 = $35"$"; print}' infile > outfile

3

Jika pembatas bidang adalah <space>:

sed 's/  */$&/35'

Jika pembatas lapangan tidak diketahui:sed 's/./$&/35'
Underverse

@Underverse - Saya tidak berpikir itu hal yang sama. Itu seharusnya mengawali karakter ke-35 pada jalur input dengan karakter $- dibatasi atau tidak. Hal di atas harus membubuhkan kemunculan ke-35 dari sejumlah karakter pembatas - dengan kata lain, bidang ke-35 - dengan karakter $- tidak peduli bagaimana karakter di masing-masing bidang.
mikeserv

Ah, "40 kolom dalam catatan". Saya membaca 'kolom ke-35' secara harfiah 'kolom karakter ke-35 dari file teks'.
Underverse

3

Untuk memesan Field-Seprator asli, saya melakukan ini. Kolom yang ingin saya hapus adalah angka $ 12.

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

Dengan gawk -i, jika Anda memilikinya, Anda dapat mengedit file di tempatnya.


1

Seandainya masalah menggunakan jawaban "disetujui", itu akan menggantikan lebih dari sekadar kolom pertama dalam file. Saya menggunakan perintah umum ini:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

Dimana:

  • [column] = kolom yang ingin Anda ubah dimulai dengan 1 (bukan 0)
  • [replace] = teks yang ingin Anda ganti

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... mengganti sejuta cap waktu dalam beberapa detik !! :)
roblogic
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.