使用awk / sed删除文件中的重复块

时间:2016-05-12 18:50:31

标签: awk sed duplicates

我想删除文件中重复的字符串块

一个块由四行组成,例如:

路径名称

起点

结束点

电压数

如果结束点重复,我想删除同一行(?)上的重复块 例如,第一个和第二个块的结束点在第一行中是相同的,我想只保留第一个块。因此,第二行上的第二个块被删除。

在第二行中,第一个和第三个块的结束点相同并保留第一个块。

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

1 个答案:

答案 0 :(得分: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 - -

我希望这可以帮到你。