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.

Marcus Thornton
sumber

Jawaban:

35

Anda bisa melakukan ini:

awk '$35=$35"$"'
cuonglm
sumber
8

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

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

Jika pembatas bidang adalah <space>:

sed 's/  */$&/35'
mikeserv
sumber
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.

zee
sumber
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
Jason G
sumber
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... mengganti sejuta cap waktu dalam beberapa detik !! :)
roblogic