awk không kết thúc


8

Tôi có đoạn mã sau trong một tệp có tên awktest1.awk:

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"} employee.txt

nơi employee.txtchứa dữ liệu sau:

100  Thomas  Manager    Sales  $5,000 
200  Jason   Developer  Technology  $5,500 
300  Sanjay  Sysadmin   Technology  $7,000 
400  Nisha   Manager    Marketing   $9,500 
500  Randy   DBA        Technology  $6,000

Tôi chạy awklệnh như:

awk -f awktest1.awk

nhưng nó chỉ in startvà không kết thúc. Bất cứ ai có thể giúp tôi với những gì tôi đang làm sai ở đây?


2
Lưu ý rằng bằng cách viết: print $2, "\t", $5trái ngược với print $2 "\t" $5, bạn đang viết trường thứ 2 theo sau là OFS (dấu cách), TAB, OFS và trường thứ 5.
Stéphane Chazelas

Câu trả lời:


12

Lỗi là đưa tên tệp để xử lý trong tập lệnh; bạn nên xóa employee.txtkhỏi tập lệnh và chạy nó như sau

awk -f awktest1.awk employee.txt

hoặc thậm chí, nếu tập lệnh được thực thi,

./awktest1.awk employee.txt

Kịch bản trở thành

#!/bin/awk -f
BEGIN{print "start"}
{print $2, "\t", $5}
END{print "end"}

Vì nó là, awkđang chờ đầu vào từ đầu vào tiêu chuẩn thay vì đọc từ một tập tin. Đó là lý do tại sao nó không bao giờ kết thúc ...


12

Để bổ sung cho câu trả lời của @ Stephen , nếu bạn muốn mã hóa tên của tệp đầu vào trong awktập lệnh, bạn sẽ viết:

#!/bin/awk -f
BEGIN{
  ARGC=2
  ARGV[1] = "employee.txt"
  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

Đối với một số tệp:

#!/bin/awk -f
BEGIN{
  ARGC=1
  ARGV[ARGC++] = "employee1.txt"
  ARGV[ARGC++] = "employee2.txt"
  ARGV[ARGC++] = "employee3.txt"
  # ...

  # or ARGC=1+split("employee1.txt employee2.txt employee3.txt", ARGV)

  OFS = FS = "\t"
  print "start"
}
{print $2, $5}
END{print "end"}

5

Hoặc nếu bạn không muốn truyền tên tệp employee.txtdưới dạng đối số dòng lệnh, bạn có thể làm một cái gì đó như thế này:

Mã số:

#!/bin/awk -f
BEGIN{
    print "start"
    while((getline <"employee.txt") > 0){
        {print $2, "\t", $5}
    }
    print "end"
} 
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.