我有一个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
答案 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.txt
:grep
中的号码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)