油灰格式化

布赖恩

当我运行下面的一行代码,我得到运行输出PuTTY中像这样:
\如下的添加,使其更易于阅读,这是不包括在实际一行程序脚本)Screesnhot1

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表才能运行屏幕截图2

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章