2013-05-10 80 views
1

我已經偶然發現了這個問題,我通過鉤子或騙子解決了這個問題。但我需要你的幫助,以精確的解決方案。作爲awk/sed的初學者,我無法用一個班輪(我確定有這個班輪)或腳本來解決它,儘管我可以使用很多管道。刪除一列中具有特定條目的csv中的行,並重復其他列中的條目

這裏有一個問題:

我有類似這樣的條目大.csv文件:

文件(分隔空間)

$ cat file 
a d e r None 
c f g r a 
c f g r None 
d a d e c 
d a d e None 
g f r t None 
g f t r None 
k f r e d 
r e t y None 
s c d er d 
g f r t 4 

有沒有重複。但是如果你仔細看,有1,2,3,4列正在重複的條目,唯一的變化是第5列,其中'None'。所以我需要刪除在1,2,3,4字段中重複的行(記錄),並且在第5列中有None

這裏是我寫的代碼,它的工作,但沒有人會建議:

awk '{print $5,$4,$3,$2,$1}' file | sed 's/None/zzz/g' | sort | awk '!array[$2,$3,$4,$5]++' | sed 's/zzz/None/g' 

,這裏是我得到的輸出,和我期待的。

4 t r f g 
a r g f c 
c e d a d 
d e r f k 
d er d c s 
None r e d a 
None r t f g 
None y t e r 

zzz替換None的目的是排序後,行會出現在端,和awk將從剩餘的列刪除重複的第二次出現。 同樣是顛倒列序列並將其重新反轉的原因。分類。

請幫忙。謝謝!

回答

3

我得到了這個解決方案:

awk '{s=$4" "$3" "$2" "$1; if($5=="None"&& s in a)next;else a[s]=$5" "s}END{for(i in a)print a[i]}' file|sort 

它輸出:

kent$ awk '{s=$4" "$3" "$2" "$1; if($5=="None"&& s in a)next;else a[s]=$5" "s}END{for(i in a)print a[i]}' file|sort 
4 t r f g 
a r g f c 
c e d a d 
d er d c s 
d e r f k 
None r e d a 
None r t f g 
None y t e r 

它似乎是與您的期望。

+0

謝謝@Kent。這工作。雖然花了一些時間來理解! – rohitkulky 2013-05-10 11:30:56