在一个while循环中sed

时间:2016-05-24 12:17:48

标签: unix ksh aix

下面是输入文件,它是此阶段的模板。我希望用脚本中的实际数据替换每行中的各种“ - ”。

DELIMITER $$
CREATE TRIGGER `content_before_insert` BEFORE INSERT ON `content`
 FOR EACH ROW BEGIN
IF NEW.guoid = 0 THEN
    INSERT INTO `content`.guoids (resource_type)
        VALUES('Content');
    SET NEW.guoid = LAST_INSERT_ID();
END IF;
END
$$
DELIMITER ;

我希望运行脚本并根据脚本中的条件一次更新(在同一文件中)一行。脚本的连续运行将更新文件的其他行。以下是剧本。

030 230 - - - - - - -
230 330 - - NA NA - - -
330 430 - - NA NA - - -
430 530 - - - - - - -
530 630 - - NA NA - - -
630 2400 - - - - - - -

预期产出低于。

##Time=`echo $(date) | awk -F ' ' '{print $4}' | awk -F ':' '{print $1$2}'`
Time=0330;

        while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9
        do
                if (( "${Time}" >= "${f1}" && "${Time}" < "${f2}" ))
                then
                    sed "s/$f3/R/;s/$f4/F/;s/$f5/G/;s/$f6/H/;s/$f7/K/"
                    else
                    echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9                                
                fi
        done < consolidated.txt

然后在上面的文件中应用Time = 0600的脚本输出类似这样的内容

030 230 - - - - - - -
230 330 - - NA NA - - -
330 430 R F NA NA G H K
430 530 - - - - - - -
530 630 - - NA NA - - -
630 730 - - - - - - -

但在使用Time = 0330(首次运行)运行脚本后,它会给出以下输出。

030 230 - - - - - - -
230 330 - - NA NA - - -
330 430 R F NA NA G H K
430 530 - - - - - - -
530 630 A B NA NA D E F
630 730 - - - - - - -

此类更改也在stdout中,而不是在文件中进行。 我试图使用sed标志-i,它不是我系统上的识别标志。

我认为sed的使用方式需要有所不同,但不确定是什么。

2 个答案:

答案 0 :(得分:1)

前导0表示十六进制,将数字解释为十进制使用10#n

if (( "10#${Time}" >= "10#${f1}" && "10#${Time}" < "10#${f2}" ))

答案 1 :(得分:0)

sed -i仅存在于GNU sed中。 AIX使用公共P​​OSIX sed。您必须输出到另一个文件,然后覆盖原始文件或安装GNU sed。

我建议安装GNU sed,从未在AIX上从源代码编译它时遇到问题。

公平地说,我不知道你为什么在这里使用sed

if (( "${Time}" >= "${f1}" && "${Time}" < "${f2}" ))
then
    sed "s/$f3/R/;s/$f4/F/;s/$f5/G/;s/$f6/H/;s/$f7/K/"
else
    echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 f9
fi

您已将所有空格分隔的部分读作变量,因此您几乎可以将它们反映出来

if (( "${Time}" >= "${f1}" && "${Time}" < "${f2}" ))
then
    echo $f1 $f2 R F G H K $f8 $f9
else
    echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 f9
fi

另外,我要杀了

< consolidated.txt

来自脚本。相反,我每次都会使用输入和输出来调用脚本,这为你调用它提供了一些自由:

cat consolidated.txt | ./script.sh > consolidated_result.txt

./script <consolidated.txt >consolidated_result.txt

cat consolidated.txt | ./script.sh | ./further_processing.sh

(这将是* nix的做事方式)