当我运行下面的一行代码,我得到运行输出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
变量中时,echo
-ed时CSV表才能运行:
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
,但是我对AWK的熟练程度最低,并且awk
在处理CSV文件时尝试拼写正确的语法。$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)"
不会伤害您,甚至可以增进理解。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句