如何将shell变量传递给awk?

如何将shell变量传递给awk?,awk,Awk,我有以下简单的脚本。但是,它错误地将计数器结果设为0 #!/usr/local/bin/bash f_name="test.stat" S_Date="2012-02-10" E_Date="2012-02-13" awk 'BEGIN {FS="\t";s_time = mktime($S_Date);e_time = mktime($E_Date);counter=0} {if ($1 >= s_time && $1 <= e_time) counte

我有以下简单的脚本。但是,它错误地将计数器结果设为0

#!/usr/local/bin/bash
f_name="test.stat"
S_Date="2012-02-10"
E_Date="2012-02-13"

awk 'BEGIN {FS="\t";s_time = mktime($S_Date);e_time = mktime($E_Date);counter=0}
     {if ($1 >= s_time && $1 <= e_time) counter++}
     END{print counter}' $f_name
#/usr/local/bin/bash
f_name=“test.stat”
S_Date=“2012-02-10”
E_Date=“2012-02-13”
awk'BEGIN{FS=“\t”;s_time=mktime($s_Date);e_time=mktime($e_Date);counter=0}

{如果($1>=s_time&&$1,
awk
命令是单引号,因此
$s_DATE
$E_DATE
是按字面意思理解的。您有几个选项:

#!/usr/local/bin/bash
f_name="test.stat" S_Date="2012-02-10" E_Date="2012-02-13"

awk 'BEGIN {FS="\t";s_time = mktime('"$S_Date"');e_time = mktime('"$E_Date"');counter=0} {if($1 >= s_time && $1 <= e_time) counter++} END{print counter}' "$f_name"
!/usr/local/bin/bash
f_name=“test.stat”S_Date=“2012-02-10”E_Date=“2012-02-13”

awk'BEGIN{FS=“\t”;s_time=mktime(“$s_Date”);e_time=mktime(“$e_Date”);counter=0}{如果($1>=s_time&&1),你最好在unix.stackexchange.com上问这个问题,它是一个
awk
程序,而且是关于SO的主题。严肃地说:这个问题怎么会有将近14000个视图,只有两张选票?(我很好奇为什么有人只有不到100个代表和2个金徽章。这就是为什么。)我怀疑这是因为人们来到这里希望对多种情况有一些了解,结果证明问题实际上是关于变量引用。你也可以将shell变量作为awk变量传递:
awk-F'\t'-v s_date=“$s_date”-v e_date=“$e_date””开始{s_time=mktime(s_date);e_time=mktime(e_date);…
(这是我最喜欢的;)@Kevin,前两个选项都返回0,尽管数据文件的日期在该范围内@glenn jackman,但您的建议会收到语法错误消息,它应该在引号内还是在bash脚本中调用?
#!/usr/local/bin/bash
f_name="test.stat" S_Date="2012-02-10" E_Date="2012-02-13"

awk "BEGIN {FS=\"\\t\";s_time = mktime($S_Date);e_time = mktime($E_Date);counter=0} {if(\$1 >= s_time && \$1 <= e_time) counter++} END{print counter}" "$f_name"
#!/usr/local/bin/bash
f_name="test.stat" S_Date="2012-02-10" E_Date="2012-02-13"

awk "$f_name" <<EOF
BEGIN {
    FS="\t"
    s_time = mktime($S_Date)
    e_time = mktime($E_Date)
    counter=0
} 
{ if(\$1 >= s_time && \$1 <= e_time) counter++ } 
END{print counter}
EOF