当我运行以下单行脚本时,我会在 PuTTY 中获得如下运行输出:(
下面\
添加以使其更易于阅读,但实际的单行脚本中不包含该输出)
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
working=`cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'`; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
echo $working; \
done; done; done
但是,如果我通过删除working=
第 3 行的部分 [不计算空白行] 和相应的“勾号”来简化脚本,从而cat
按预期执行,我会得到很好的输出;直到它被封装在working
变量中时,CSV 表才会在 -ed 时运行echo
:
fileName=10M.csv ; \
for k in {1..3}; do for i in {1..1}; do for j in {blue,red,yellow}; do \
cat "$fileName" | \
awk -v i=$i -v j=$j -v k=$k -F',' '{ if ( $1 == j && $2 == i && $3 == k ) print $1","$2","$3","$4","$13","$14}'; \
nJ=${j:0:1}; \
nJ=${nJ^^}; \
echo "$i $j $nJ $k"; \
new="$i""_""$nJ""_""$k""_.txt"; \
echo $new; \
done; done; done
我的脚本在 PuTTY 中产生运行输出时出了什么问题?
- 我猜想这与有关,但我对 AWK 的技能要求很低,并尝试在处理 CSV 文件时
awk
逐个发送正确的语法。awk
答案1
$working
您忘记在扩展时使用双引号(即在您的echo
命令中),因此它会受到单词拆分的影响;不是整个值成为“echo”的单个参数,而是每个空格分隔的单词都成为单独的参数,并且原始分隔符会丢失,因为echo
始终使用单个空格连接接收到的参数:
$ myvar="One Two
Three
Four Five"
$ ruby -e 'p ARGV' "$myvar"
["One Two\nThree\nFour Five"]
$ ruby -e 'p ARGV' $myvar
["One", "Two", "Three", "Four", "Five"]
- 一般来说,同样的方法也适用于
`cmd`
,以及$(cmd)
所有其他扩展,但您的反引号使用恰好是例外,因为它是变量赋值的一部分——也就是说,的具体情况在var=`cmd`
技术上可以不加引号,但将其更改为var="`cmd`"
,甚至var="$(cmd)"
,不会造成损害,并且可能会提高理解。