Làm cách nào tôi có thể đệm một trường cụ thể trong tệp văn bản?


3

Tôi có một tập tin như thế này:

123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr

Tôi muốn zero-pad trường giữa để đưa ra kết quả:

123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr

Làm thế nào để tôi thực hiện một kịch bản mà làm điều này?

Tôi đã thấy một ví dụ như thế này

awk '{ $6=sprintf("%06s", $6); print $0}'

nhưng tôi không thực sự hiểu nó và do đó không thể làm cho nó hoạt động.

Câu trả lời:


7

Thử đi:

awk -F , '{ printf "%i,%08i,%s\n" , $1 , $2 , $3 }' file

sẽ làm, cảm ơn, bạn có thể giải thích làm thế nào điều này hoạt động?
mattm123

2
Ok, -F ,nói awkđể sử dụng ,như tách lĩnh vực, sau đó nó sẽ in tất cả ba lĩnh vực ( $1, $2$3) với một định dạng tùy chỉnh: "%i,%08i,%s\n", %ilà dành cho số nguyên, %08ithiết lập chiều rộng lĩnh vực tới 8 trái đệm với số không và %scho các chuỗi. Để biết thêm thông tin xem man printfhoặc ở đây . Hy vọng điều này sẽ giúp bạn.
cYrus

tôi cần thay đổi dấu phẩy dấu phẩy thành một cedilla bằng cách sử dụng thông số $ '\ xE7' nhưng khi tôi sử dụng printf "% i" $ '\ xE7' "% 08i \ n", $ 1, $ 2 thì nó không chính xác. có ý kiến ​​gì không
mattm123

Một cái gì đó như : awk -F , '{ printf "%i\xe7%08i\xe7%s\n" , $1 , $2 , $3 }' file?
cYrus

1

Vì bạn đã gắn thẻ câu hỏi của mình [sed], đây là sedphiên bản dựa trên tập lệnh ở đây .

sed 's/[^,][^,]*/\n0000000&/2;s/\n[^,]*\(.\{8\}\),/\1,/' inputfile

Giải trình:

  • một trường bao gồm một nhóm gồm một hoặc nhiều dấu phẩy: [^,][^,]*(điều này cũng có thể được viết là [^,]\+)
  • thay thế cho trường thứ hai (khớp) ( s///2) một dòng mới, một số không và nội dung của trận đấu: \n0000000&(dòng mới được sử dụng để đánh dấu điểm bắt đầu của trường cho bước tiếp theo)
  • bây giờ khớp với dòng mới, không hoặc nhiều dấu phẩy và chính xác tám \{8\}ký tự bất kỳ (bắt các ký tự \(\)đó) theo sau là dấu phẩy
  • thay thế các ký tự bị bắt \1cho trận đấu, điều này sẽ loại bỏ dòng mới tạm thời và các số không thừa

Cách thức hoạt động này là thêm các số 0 thừa ở đầu trường, sau đó cắt bỏ tất cả trừ


0

lệnh trong câu hỏi của bạn là chính xác chỉ cần một số cập nhật.

awk '{ $6=sprintf("%0.8s", $6); print $0}'

cũng để thay đổi sử dụng bộ tách trường đầu ra:

awk '{ OFS="\xE7"; $6=sprintf("%0.8s", $6); print $0}'

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.