nổ băm của bạn xác định kịch bản không phải là shell script, nó là một kịch bản awk. bạn không thể làm điều đó theo cách bash trong kịch bản của bạn.
cũng vậy, những gì bạn đã làm: echo blah|awk ...
là không truyền tham số, nó sẽ đưa đầu ra của lệnh echo sang lệnh khác.
bạn có thể thử những cách dưới đây:
echo "hello"|./foo.awk file -
hoặc
var="hello"
awk -v a="$var" -f foo.awk file
với điều này, bạn có var a
trong foo.awk của bạn, bạn có thể sử dụng nó.
nếu bạn muốn làm điều gì đó giống như tập lệnh shell chấp nhận $ 1 $ 2 vars, bạn có thể viết một shellscript nhỏ để bọc những thứ awk của bạn.
EDIT
Không, tôi không hiểu lầm bạn.
chúng ta hãy lấy ví dụ:
giả, x.awk
của bạn có:
{print $1}
nếu bạn làm:
echo "foo" | x.awk file
nó là giống như:
echo "foo"| awk '{print $1}' file
ở đây đầu vào cho awk chỉ là file
, echo của bạn không có ý nghĩa.nếu bạn làm:
echo "foo"|awk '{print $1}' file -
or
echo "foo"|awk '{print $1}' - file
awk mất hai đầu vào (lập luận cho awk) một là stdin là một trong những tập tin, trong kịch bản awk của bạn, bạn có thể:
echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file
này sẽ in đầu tiên foo
từ tiếng vang của bạn , sau đó cột1 từ file
tất nhiên ví dụ này không có tác dụng gì, chỉ cần in tất cả.
nhiên bạn có thể có nhiều hơn hai đầu vào, và không kiểm tra NR và FNR, bạn có thể sử dụng
ARGC The number of elements in the ARGV array.
ARGV An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1
ví dụ:
echo "foo"|./x.awk file1 - file2
sau đó bạn "foo" là arg thứ 2, bạn có thể lấy nó trong x.awk của bạn bằng cách ARGV[2]
echo "foo" |x.awk file1 file2 file2 -
bây giờ là ARGV [4].
Ý tôi là, echo "foo"|..
của bạn sẽ là stdin cho awk, nó có thể bởi 1 hoặc thứ n "đối số"/đầu vào cho awk. phụ thuộc vào nơi bạn đặt -
(stdin). Bạn phải xử lý nó trong kịch bản awk của bạn.
comlete awk tutotial [có sẵn] (http://www.gnu.org/software/gawk/manual/gawk.html#Invoking- Gawk) – jhonnash