it-swarm-vi.tech

Làm thế nào tôi có thể cắt khoảng trắng từ một biến trong awk?

Giả sử $ 2 là biến của tôi. Tôi đã cố gắng đi từ

awk -F\, '{print $2 ":"}'

đến 

awk -F\, '{print gsub(/[ \t]+$/, "", $2) ":"}'

Nhưng nó đi từ in một cái gì đó đến in không có gì cả.

24
Hoa

Bạn đang in kết quả của gsub, nhưng gsub thực hiện sửa đổi tại chỗ $2 thay vì trả lại một bản sao đã sửa đổi. Gọi gsub, sau đó in:

awk -F\, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}'
44
je4d

Các chức năng này có ích để cải thiện khả năng đọc. Họ cũng trả lại kết quả đã cắt:

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN {
# whatever
}
{
# whatever
}
END {
# whatever
} 

Nguồn: https://Gist.github.com/andrewrcollins/1592991

29
Jong Bor Lee

(Tôi không có đủ điểm để nhận xét trực tiếp về câu trả lời trước đó.)

Để cắt khoảng trắng ở end of $2, hãy sử dụng:

awk -F\, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}'

Để cắt khoảng trắng ở bắt đầu của $2, hãy sử dụng:

awk -F\, '{gsub(/^[ \t]+/, "", $2); print $2 ":"}'

Và cho cả kết thúc và bắt đầu:

awk -F\, '{gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); print $2 ":"}'
16
JGC

Một lót cho gawk:

gawk -F\, '{$2 = gensub(/^[ \t]*|[ \t]*$/,"","g",$2)}'
3
Ben

ltrim và rtrim trong Unix

awk 'BEGIN{FS=OFS="|"} {gsub(/^[ \t]+|[ \t]+$/, "", $2)}1' filename.txt

1
VIPIN KUMAR

Một lựa chọn đơn giản hơn:

Bạn phải xác định chức năng cắt, sử dụng gsub để thay thế chung. Sau đó tìm bằng regex nếu bắt đầu hoặc kết thúc bằng dấu cách (một hoặc nhiều lần), trả về trường. 

   awk -F'|' 'function trim(field){
   gsub(/^ +| +$/,"", field); 
   return field
   }{
   OFS=",";
   print trim($2),trim($3)}' stations > lista.csv

Với mã này là enougth

Và tệp trạm là với cấu trúc này:

     1 | UTAR | U de Tarapacá                   
     3 | VALN | Valparaíso                      
     4 | JRGN | Junta Gorgino                   
     6 | TRPD | Torpederas  
0