2011-10-12 69 views
4

我有一个平面文件如下包含一个特定的模式:如何追加到文件中的行不使用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个小时运行。我相信它花费了很多时间,因为它必须搜索每一行并写入临时文件。有没有更快的方法来实现这一目标?

回答

2

如果TEMP.TXT是你的文件,请尝试:

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

感谢。这个效果很好:) 如果我不想在包含NO或aaa的行中追加YES,我如何修改上述命令? – AKS

+1

您应该使用'|' (替代)正则表达式字符,像这样 awk'$ 0!〜/ NO | aaa/{print $ 0“| YES |”} $ 0〜/ NO | aaa/{print}'temp.txt 作为感兴趣的事情,你的测试用例的速度差是多少? – Max

+0

超级。这正是我想要的。该操作现在需要一分钟时间才能执行。我以前的逻辑过去需要大约3小时:)非常感谢 – AKS

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

4

这将是快速:

sed '/NO/!s/$/|YES|/' filename 
相关问题