【问题标题】:Deleting duplicated chunks in a file using awk/sed使用 awk/sed 删除文件中的重复块
【发布时间】:2016-05-14 08:08:10
【问题描述】:

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

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

路径名

起点

终点

电压数

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

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

输入.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

输出.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 可以完成这项工作。任何帮助表示赞赏。

最好的,

在英

【问题讨论】:

  • 我试过'uniq',它只显示uniq字符串,但不知道如何显示uniq块,我试过awk,但我是awk的新手。所以,请。任何建议表示赞赏。
  • 我知道这听起来很熟悉。恕我直言,您最好尝试修复您以前的 Q (stackoverflow.com/questions/37141953/…) 而不是这种方法。这种新布局使您更难理解您的问题。祝你好运。
  • 嗨@jaeyoung-park,你所有的块都包含重复的还是只有其中的一部分?

标签: awk sed duplicates


【解决方案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 - -

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多