2011-10-12 65 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 
相關問題