2016-05-12 69 views
0

我想刪除字符串的重複數據塊在一個文件中用awk刪除重複的數據塊在文件/ sed的

一個塊是由四個線,如:

路徑名

出發點

終點

電壓數

如果終點重複,我想刪除同一行(?)上的重複塊。
例如,第一個和第二個塊的結束點在第一行中是相同的,我只想保留第一個塊。因此,第二行將被刪除。

在第二行中,第一個和第三個塊的結束點相同並保留第一個塊。

input.txt中:

path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_2759 path_sparc_ffu_dp_out_3115 
R_1545/Q R_1541/Q R_1545/Q 
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.926208 0.910592 0.905082 
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712 path_sparc_ffu_dp_out_819 
R_1053/Q R_1053/Q R_1053/Q 
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.945436 0.945436 0.9435 

output.txt中:

path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_3115 
R_1545/Q  R_1545/Q 
dp_ctl_synd_out_low[6]  dp_ctl_synd_out_low[2] 
0.926208  0.905082 
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712 
R_1053/Q R_1053/Q  
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] 
0.945436 0.945436  

我覺得AWK/SED能做到這一點的工作。任何幫助表示讚賞。

最佳,

Jaeyoung

+0

我試過'uniq'只顯示uniq字符串,但不知道如何顯示uniq塊,我嘗試過awk,但是我是awk上的新成員。所以,請。任何建議表示讚賞。 –

+1

我知道這聽起來很熟悉。恕我直言,你會做得更好,試圖修復你以前的Q(http://stackoverflow.com/questions/37141953/relocation-strings-using-awk-sed-from-a-index-file)而不是這種方法。這種新的佈局會讓你更難理解你的問題。祝你好運。 – shellter

+0

Hi @ jaeyoung-park,你所有的塊都包含重複項或只包含其中的一部分? –

回答

1

此解決方案假定您的輸入數據:

$ sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt | paste - - - - | awk '{ $8=="-"?dup=2:dup=3; for(i=1;i<=NF;i++){if(dup!=((i-1)%3+1)){print $i}} }' | paste - - 
path_sparc_ffu_dp_out_1885  path_sparc_ffu_dp_out_3115 
R_1545/Q  R_1545/Q 
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.926208  0.905082 
path_sparc_ffu_dp_out_699  path_sparc_ffu_dp_out_712 
R_1053/Q  R_1053/Q 
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] 
0.945436  0.945436 

我將解釋解決方案一步一步如下:

替代終點重複帶有減號:

sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt 

顯示在一個行中的塊:

paste - - - - 

使用awk,排除重複的列(第二或第三):

# find if the duplicate is in the second or in the third column 
$8=="-"?dup=2:dup=3; 
# exclude all the seconds or thirds fields (previous calculated) 
for(i=1;i<=NF;i++){ 
    if(dup!=((i-1)%3+1)){ 
     print $i 
    } 
} 

最後paste顯示在原來的形式的數據:

paste - - 

我希望這可以幫助你。