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

时间:2013-02-04 16:44:21

标签: 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 '{print substr($0,0,4)}'

错误讯息:

 -F,: not found

4 个答案:

答案 0 :(得分:2)

使用command substitution将命令的输出分配给变量,如下所示:

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

答案 1 :(得分:0)

你要求shell做:

VAR=value command [arguments...]

表示:启动command,但先将VAR=value环境传递给它 (例如:LC_ALL=C grep '[0-9]*' /some/file.txtgrep中的号码file.txt LC_ALL中的号码C变量设置为grep仅适用于-F"," {1}})

所以在这里:你要求shell启动-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)}')"

只需将其替换为:

{{1}}

(我没试过,但我希望它们能为你和你的sample.csv文件工作)

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

答案 2 :(得分:0)

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

YEAR=$(awk -F, 'NR==3{sub(/^[ \t]*/, "", $16); print ">" substr($16,1,4) "<" }')

更好的是,你甚至不必使用awk。既然你已经编写了shell脚本,那么让我们在shell脚本中完成所有这些:

{ read line; read line; read line; } < sample.csv # Get the third line
IFS=, set $line   # Breaks line into comma-separated fields
IFS=" " set ${16} # Trick to remove leading spaces, field 16 becomes field 1
YEAR=${1:0:4}     # Extract the first 4 char from field 1

答案 3 :(得分:0)

这样做:

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