Làm thế nào để thay thế nội dung của một cột cụ thể bằng awk?


31

Cho: có 40 cột trong một bản ghi. Tôi muốn thay thế cột thứ 35 để cột thứ 35 sẽ được thay thế bằng nội dung của cột thứ 35 và ký hiệu "$". Điều gì đến với tâm trí là một cái gì đó như:

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

Nó hoạt động nhưng vì nó không khả thi khi số lượng cột lớn tới 10k. Tôi cần một cách tốt hơn để làm điều này.

Câu trả lời:



8

Có lẽ có nhiều cách hiệu quả hơn để làm điều này. Với lời cảnh báo đó:

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

3

Nếu dấu phân cách trường là <space>:

sed 's/  */$&/35'

Nếu không xác định dấu phân cách trường:sed 's/./$&/35'
Bỏ qua

@Underverse - Tôi không nghĩ đó là điều tương tự. Điều đó sẽ có tiền tố char thứ 35 trên một dòng đầu vào có $phân tách char hay không. Điều ở trên nên gắn sự xuất hiện thứ 35 của bất kỳ số ký tự phân cách nào - nói cách khác, trường thứ 35 - với char $- bất kể ký tự trong mỗi trường như thế nào.
mikeerv

À, "40 cột trong một bản ghi". Tôi đọc 'cột thứ 35' theo nghĩa đen là 'cột ký tự thứ 35 của tệp văn bản'.
Đánh bại

3

Để bảo lưu Field-Seprator ban đầu, tôi đã làm điều này. Cột tôi muốn bỏ trống là số $ 12.

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

Với gawk -i, nếu bạn có nó, bạn có thể chỉnh sửa tập tin tại chỗ.


1

Có vấn đề khi sử dụng câu trả lời "được phê duyệt", nó sẽ thay thế nhiều hơn chỉ là cột đầu tiên trong tệp. Tôi sử dụng lệnh chung này:

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

Ở đâu:

  • [column] = cột bạn muốn thay đổi bắt đầu bằng 1 (không phải 0)
  • [replace] = văn bản bạn muốn thay thế

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... Đã thay thế một triệu dấu thời gian trong vài giây !! :)
roblogic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.