我有一个以2列格式第一列x轴,第二列y轴的点坐标列表,我想制作一个脚本来重新缩放轴。
输入文件示例
4 3
3 6输出文件示例(重新调整为10 10)
10 5
7.5 10
为此,我首先获得两列上的最大坐标(使用sort
,head
和cut
),然后使用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>
答案 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