0

我有一个 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

4 回答 4

2

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

YEAR=$(awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}')
于 2013-02-04T17:08:46.250 回答
0

做这个:

year=$(awk -F, 'NR==3{sub(/^[ \t]+/,"",$16); print substr($16,1,4); exit }' sample.csv)
于 2013-02-04T18:05:29.697 回答
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
于 2013-02-04T17:34:00.463 回答
0

你要求外壳做:

VAR=value command [arguments...]

这意味着:启动commandVAR=value首先将其传递给环境(例如: LC_ALL=C grep '[0-9]*' /some/file.txt : 将grep输入一个数字file.txt(并且LC_ALL变量设置为C仅在调用期间grep

所以在这里:您要求外壳程序启动-F","命令(即,-F,一旦外壳程序将参数解释",", 参数'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))

于 2013-02-04T17:11:17.323 回答