Putty 格式化

Putty 格式化

当我运行以下单行脚本时,我会在 PuTTY 中获得如下运行输出:(
下面\添加以使其更易于阅读,但实际的单行脚本中不包含该输出) 屏幕截图1

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截图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 的技能要求很低,并尝试在处理 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)",不会造成损害,并且可能会提高理解。

相关内容