运行perl命令表单shell脚本

时间:2016-03-05 13:28:01

标签: regex perl shell

我有一个以2列格式第一列x轴,第二列y轴的点坐标列表,我想制作一个脚本来重新缩放轴。

  

输入文件示例
     4 3
     3 6

     

输出文件示例(重新调整为10 10)
     10 5
     7.5 10

为此,我首先获得两列上的最大坐标(使用sortheadcut),然后使用perl替换regexp插入所有行。< / p>

所以我编写了脚本:

#!/bin/sh
# run:  $ ./normalize x y input_file output_file
X=$1
Y=$2
INPUT=$3
OUTPUT=$4

BIGGEST_FIRST_COLUMN=$(sort -nrk1 $INPUT | head -n1 | cut -d ' ' -f 1)
BIGGEST_SECOND_COLUMN=$(sort -nrk2 $INPUT | head -n1 | cut -d ' ' -f 2)

PERL_CMD="'s!([\d.]+)\s([\d.]+)!(\$1/$BIGGEST_FIRST_COLUMN*$X).\" \".(\$2/$BIGGEST_SECOND_COLUMN*$Y)!e'"

CMD="perl -pe $PERL_CMD $INPUT > $OUTPUT"
echo "Run the following cmd : "
echo $CMD

$CMD

此代码输出我要运行的perl onliner,然后尝试运行它。 此时,perl oneliner正在工作:我可以复制粘贴它并手动运行它,它会提供正确的输出。然而,当脚本自动运行时,我遇到了一个错误:

Can't find string terminator "'" anywhere before EOF at -e line 1.

我想这是由于我在shell中理解"'时遇到的一些问题,但此时我不知道......所以如果你有任何提示,欢迎< / p>

2 个答案:

答案 0 :(得分:1)

您应该更改最后一行:

#!/bin/sh
# run:  $ ./normalize x y input_file output_file
X=$1
Y=$2
INPUT=$3
OUTPUT=$4

BIGGEST_FIRST_COLUMN=$(sort -nrk1 $INPUT | head -n1 | cut -d ' ' -f 1)
BIGGEST_SECOND_COLUMN=$(sort -nrk2 $INPUT | head -n1 | cut -d ' ' -f 2)

PERL_CMD="'s!([\d.]+)\s([\d.]+)!(\$1/$BIGGEST_FIRST_COLUMN*$X).\" \".(\$2/$BIGGEST_SECOND_COLUMN*$Y)!e'"

CMD="perl -pe $PERL_CMD $INPUT > $OUTPUT"
echo "Run the following cmd : "
echo $CMD

# $CMD  < no
eval $CMD

答案 1 :(得分:0)

这是一个Perl单行程序,可以按照您的要求执行,而无需shell来预处理数据

perl -MList::Util=max -E'@d=map[split],<>;for $i(0,1){$m=max map $$_[$i],@d; $$_[$i]*=10/$m for @d} say qq{@$_} for @d' data.txt

输出

10 5
7.5 10