如何使用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个小时:)非常感谢