如何使用shell脚本附加到不包含特定模式的文件中的行

时间:2011-10-12 15:25:50

标签: shell

我有一个平面文件如下:

11|aaa
11|bbb|NO|xxx
11|ccc
11|ddd|NO|yyy

对于不包含 | NO | 的行,我想在最后添加字符串 | YES | 。所以我的文件应该是这样的:

11|aaa|YES|
11|bbb|NO|xxx
11|ccc|YES|
11|ddd|NO|yyy

我正在使用AIX和 sed -i 选项进行内联替换不可用。因此,目前我正在使用以下代码执行此操作:

#Get the lines that do not contain |NO|
LINES=`grep -v "|NO|" file`

for i in LINES
do
    sed "/$i/{s/$/|YES|/;}" file > temp
    mv temp file
done

然而,上述工作,因为我的文件包含超过40000行,运行大约需要3个小时。我相信这需要花费很多时间,因为它必须搜索每一行并写入临时文件。有没有更快的方法来实现这一目标?

3 个答案:

答案 0 :(得分:4)

这很快:

sed '/NO/!s/$/|YES|/' filename

答案 1 :(得分:2)

如果temp.txt是您的文件,请尝试:

awk '$0 !~ /NO/ {print $0 "|YES|"} $0 ~ /NO/ {print}' temp.txt

答案 2 :(得分:1)

简单awk。将下面的代码放入脚本中并使用awk -f script file > temp

运行它
/\|NO\|/ { print; next; } # just print anything which contains |NO| and read next line
{ print $0 "|YES|"; } # For any other line (no pattern), print the line + |YES|

我不确定awk regexps;如果它不起作用,请尝试删除第一个模式中的两个\