2012-03-04 5 views
9

Tôi writting một kịch bản shell trong đó bao gồm một vài dòng awk

dòng awk trông giống như:

cat input.csv | awk -F, '$1~/$1/ {print "is good"}' 

các $1 đầu tiên là cột đầu tiên của đầu vào csv, số thứ hai $1 được cho là đầu vào dòng lệnh đầu tiên của tập lệnh shell này

Tôi đã cố gắng đặt \ ở phía trước số thứ hai $, nhưng có vẻ như không làm việc.

Có ai giúp được không?

Trả lời

5
cat input.csv | awk -F, '$1~/'"$1"'/ {print "is good"}' 

Bạn cần phải đóng chuỗi ', chèn vỏ $1 (bên " trong trường hợp có ký tự đặc biệt), sau đó mở lại chuỗi '.

Và bạn có thể muốn kiểm tra xem $1 từ vỏ có chứa / các ký tự sẽ làm nổi bật cụm từ thông dụng hay không.

Và như @Ignacio Vazquez-Abrams đã chỉ ra, bạn không cần phải rút đầu ra của cat để hoạt động, bạn chỉ có thể nhận được awk để đọc tệp trực tiếp. Đó là:

cat input.csv | awk ... 

có thể được đơn giản hóa để:

awk ... < input.csv 
+1

Điều đó không thực sự khiến bạn khó đọc tệp. Nó nói với vỏ để nuôi nó trực tiếp vào stdin của awk thay vì sử dụng mèo. –

+0

@Ignacio Vazquez-Abrams: Tôi biết nhưng tôi không muốn tham gia vào quá nhiều biến chứng. –

+0

@ IgnacioVazquez-Abrams Chuyển hướng không "cấp dữ liệu trực tiếp vào stdin của awk". Tệp * trở thành stdin của awk. Việc sử dụng con mèo vô ích cung cấp nội dung của tệp cho stdin của awk, và I/O vô ích đó là lý do tại sao UUOC không hiệu quả. –

4

Một biến là tốt quá.

awk -F, -v needle="$1" '$1 ~ needle {print "is good"}' < input.csv 
+0

Ý tưởng tốt về biến phụ. Tôi đoán rằng loại bỏ bất kỳ vấn đề mà '$ 1' có thể chứa các ký tự đặc biệt, phải không? –

+5

Mỗi nhân vật đều đặc biệt theo cách riêng của mình. –

1

mèo hoặc chuyển hướng là không cần thiết. Dưới đây là biến thể thứ ba sử dụng dấu gạch chéo ngược:

awk -F, "\$1~/$1/ {print \"is good\"}" input.csv