如何在shell脚本中执行awk命令

如何在shell脚本中执行awk命令,shell,awk,ksh,Shell,Awk,Ksh,我有一个awk命令,它从csv文件的第3行中提取第16列,并打印前4个字符 awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}' 这个很好用 但是当我从一个shell脚本执行它时,我得到了一个错误 #!/bin/ksh YEAR=awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{prin

我有一个awk命令,它从csv文件的第3行中提取第16列,并打印前4个字符

awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}'
这个很好用

但是当我从一个shell脚本执行它时,我得到了一个错误

#!/bin/ksh
YEAR=awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}'
错误消息:

 -F,: not found
用于将命令的输出分配给变量,如下所示:

YEAR=$(awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}')

您要求shell执行以下操作:

VAR=value command [arguments...]
这意味着:启动
命令
,但首先将
VAR=value
环境传递给它 (例如:
LC_ALL=C grep'[0-9]*'/some/file.txt
:将
grep
文件.txt中的一个数字设置为
LC_ALL
变量设置为
C
,仅在
grep
调用期间)

因此,在这里:您要求shell启动
-F“,
命令(即,
-F,
一旦shell将
”,“
解释为
,参数
'NR==3………
,变量
YEAR
在命令调用期间设置为值
awk

只需将其替换为:

#!/bin/ksh
YEAR="$(awk -F',' 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,1,4)}')"
(我没有尝试过,但我希望它们适用于您和您的sample.csv文件)


(请注意,您使用“0”匹配字符位置1,这在许多awk实现中都有效,但不是全部(即大多数(但不是全部)在写入0时都假定为1))

根据您的描述,您似乎希望从第16个字段中提取年份,该字段可能包含前导空格。您可以通过调用awk一次来完成:

YEAR=$(awk -F, 'NR==3{sub(/^[ \t]*/, "", $16); print ">" substr($16,1,4) "<" }')
YEAR=$(awk-F,'NR==3{sub(/^[\t]*/,”,“,$16);打印“>”substr($16,1,4)”执行以下操作:

year=$(awk -F, 'NR==3{sub(/^[ \t]+/,"",$16); print substr($16,1,4); exit }' sample.csv)

你有没有试过
YEAR=$(你的awk东西| sed | awk | sed | awk…
太棒了!!真的很管用..谢谢你的帮助。顺便说一句,你的
awk | sed | awk
组合很管用,不过这就像是用核弹炸死一只苍蝇,还有3颗核弹…必须有改进的空间。嗯,首先要让它管用。:)您最好将整个命令子项包含在““正如我所做的那样,如果它返回超过1个单词,您将调用另一个
var=word1 word2….
调用命令
word2….
,值
var
设置为
word1
对awk脚本有很好的建议,但不要执行shell操作,因为它很容易出错(例如,如果“行”将失败包含反斜杠或其他各种字符)和繁琐(尝试将其修改为在第67行而不是第3行上工作)。我同意这一点。修改为在第3行以外的行上工作并不是那么难。软件中没有什么是“那么难”的。这是唯一的软件。问题是,尽管您不会编写67“读取行”因此,即使您很高兴在这个脚本中有3个重复的、硬编码的语句,您也需要在某个时候重新编写脚本,以处理不同的行号,因此我认为这很麻烦,我建议您不要这样做。谢谢大家的精彩输入。我今天过得很好!
year=$(awk -F, 'NR==3{sub(/^[ \t]+/,"",$16); print substr($16,1,4); exit }' sample.csv)