2012-10-23 15 views
5

Tôi có một lớp lót đơn giản mà gấp dòng tiếp theo vào dòng hiện tại khi một mẫu đã cho phù hợp. Ở đây là:Hiệu ứng có một số dấu có trên phần thân của tập lệnh awk?

awk '/two/ { printf $1; next; } 1' test.txt 

với đầu vào sau:

one 
two 
three 
four 
five 
six 

one 
two 
three 
four 

bạn nhận được:

one 
twothree 
four 
five 
six 

one 
twothree 
four 

Lưu ý rằng "ba" được gấp lại với "hai", đó là những gì Tôi muốn xảy ra. Tôi tìm thấy giải pháp này (không nhớ ở đâu) và nghĩ rằng nó kỳ lạ rằng dấu '1' dường như là phần còn thiếu dẫn đến hiệu quả mong muốn. Nếu bạn lấy nó ra, bạn nhận được:

awk '/two/ { printf $1; next; }' test.txt 
twotwo 

Kết quả là. Vì vậy, câu hỏi của tôi là, dấu "1" làm gì, và nó được ghi chép ở đâu?

Cảm ơn!

Trả lời

6

Đối với awk, 1 có nghĩa là đúng và khi biểu thức đúng, awk in dòng hiện tại theo mặc định.

Ví dụ:

  • awk '1' /etc/passwd sẽ in toàn bộ tập tin
  • awk '0' /etc/passwd sẽ không in toàn bộ tập tin

Nếu bạn giỏi trong số học (hoặc bạn có tưởng tượng hay lập trình kỹ năng), có nhiều thủ thuật bạn có thể làm với hành vi này.

3

"The '1' ở cuối của toàn bộ Awk một lớp lót in ra dòng sửa đổi (đó là cú pháp đường cho chỉ" in "(chính nó là cú pháp đường cho" in $ 0 "))".

-catonmat

+0

Ah! Cảm ơn các liên kết. Rất hữu ích. – drsnyder

1

Bạn có câu trả lời của bạn cho câu hỏi cụ thể của bạn NHƯNG kịch bản mà bạn đã viết là không an toàn. Đối số đầu tiên cho printf là một chuỗi định dạng, không phải dữ liệu. Đôi khi bạn có thể sử dụng nó để in dữ liệu nhưng chỉ khi nó được mã hóa cứng trong tập lệnh của bạn, không phải khi bạn đọc nó từ đầu vào. Hãy xem những gì sẽ xảy ra nếu đầu vào của bạn xảy ra để chứa một chuỗi định dạng printf:

$ cat file 
one 
two%s 
three 
four 

$ awk '/two/ { printf $1; next; } 1' file 
one 
awk: cmd. line:1: (FILENAME=file2 FNR=2) fatal: not enough arguments to satisfy format string 
     `two%s' 
      ^ran out for this one 

Cách đúng để viết kịch bản là:

$ awk '/two/ { printf "%s",$1; next; } 1' file 
one 
two%sthree 
four 
Các vấn đề liên quan