【问题标题】:Running perl command form shell script运行 perl 命令形式的 shell 脚本
【发布时间】:2016-06-19 06:59:57
【问题描述】:

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

输入文件示例
4 3
3 6

输出文件示例(重新缩放为 10 10)
10 5
7.5 10

为此,我首先获取两列上的最大坐标(使用 sortheadcut),然后使用 perl 替代正则表达式插入所有行。

所以我编写了这样的脚本:

#!/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 中的"' 的理解有些问题,但目前我不知道......所以如果你有任何提示,欢迎

【问题讨论】:

    标签: regex perl shell


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      这是一个 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
      

      【讨论】:

      • 啊,好样的!写这样的单行字还不够舒服:-)
      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 2014-11-21
      • 2013-07-18
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2011-05-31
      相关资源
      最近更新 更多