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

如何使用shell脚本附加到文件中不包含特定模式的行,shell,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=`

我有一个平面文件如下:

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个小时。我相信这需要花费很多时间,因为它必须搜索每一行并写入临时文件。有没有更快的方法来实现这一点?

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

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

使用
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;如果不起作用,请尝试删除第一个模式中的两个
\

这将很快:

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

谢谢这很好:)如果我不想在包含NO或aaa的行中附加YES,我如何修改上面的命令?您应该使用“|”(可选)regexp字符,比如这个awk“$0!”/不| aaa/{print$0“| YES |“}$0~/NO | aaa/{print}'temp.txt作为一个有趣的问题,您的测试用例的速度差异是什么?超级。这正是我想要的。该操作现在需要不到一分钟的时间来执行。我以前的逻辑通常需要3个小时:)非常感谢