打印出shell变量和""在awk / sed脚本中使用echo / printf

时间:2014-06-26 04:52:49

标签: bash awk sed printf echo

打印输出问题:我们需要将以下awk打印到.sh文件中。 (删除第12列中所有“0”的行)

awk -F, '$12 != "0"' output.csv >> output2.csv

这是我们的脚本(案例循环是另一个目的所必需的。这是一个更大的脚本的一小步。假设$ TargetIDs = 123):

case $TargetIDs in ($P1) echo "awk -F, '$12 != "0"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv" >> output.sh;

(*)  ;;

esac

这将在“output.sh”中打印出以下内容。 “12美元”中的“1美元”消失了:(

awk -F, '2 != "0"' 123_output.csv >> 123_output2.csv

我们尝试一个数组:

 V="12"

 b=($V)

case $TargetIDs in ($P1) echo "awk -F, '${b[1]} != "0"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv" >> output.sh;

(*)  ;;

esac

这将在“output.sh”中打印出以下内容。 $ 12消失:

    awk -F, ' != 0' output.csv >> output2.csv

第二个问题是类似的:我们使用sed方式:

我们要打印出这个sed:

    sed -i.temp '/"0"/d' 123_output.csv.temp
    mv 123_output.csv.temp 123_output.csv

这是脚本

    case $TargetIDs in ($P1) printf "sed -i.temp '/"0"/d' ${TargetIDs}_output.csv.temp\n mv ${TargetIDs}_output.csv.temp ${TargetIDs}_output.csv\n" >> output.sh ;;

    (*)  ;;

    esac

这将在“output.sh”中打印出以下内容:

sed -i.temp '/0/d' 123_output.csv.temp
mv 123_output.csv.temp 123_output.csv

sed命令在“output.sh”

中变成了这个
sed -i.temp '/0/d'

而不是

sed -i.temp '/"0"/d'

“”在“output.sh”中消失,因此所有已归零的行将被

删除
sed -i.temp '/0/d'

不知道大师可能会有一些解决方案吗?谢谢!

2 个答案:

答案 0 :(得分:0)

你需要看你的报价。在双引号内,单引号并不特别,但美元符号是。好的一点是,您可以连接多个引用的段,因此您可以在同一参数中的不同引用样式之间进行更改。

试试这个:

echo "awk -F, '"'$12 != "0"'"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv"

如果TargetIDs可能包含空格或shell元字符,那么您还需要在生成的文本中插入更多引号:

echo "awk -F, '"'$12 != "0"'"' \"${TargetIDs}_output.csv\" >> \"${TargetIDs}_output2.csv\""

根据评论中的讨论,:

之间存在差异
awk -F, '$12 != "0"' output.csv >> output2.csv

awk -F, '$12 != 0' output.csv >> output2.csv

在字段12为00的情况下。但是,如果要删除第12个字段为"0"的行,则这两个都不正确,这似乎是第二个问题中sed行的点。为了抓住这个,你需要:

awk -F, '$12 != "\"0\""' output.csv >> output2.csv

确保使用的是正确的版本。

答案 1 :(得分:0)

试试这个:

echo "awk -F, '\$12 != 0' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv"

这当然假定您将第12列视为数值。