【问题标题】:Remove duplicate records from a three column file从三列文件中删除重复记录
【发布时间】:2019-12-10 09:45:37
【问题描述】:

我正在尝试从包含 3 列的 txt 文件中删除一些条目。前两个包含 ID 条目,第三个包含其百分比,如下所示:

ID#3    ID#1    100.00
ID#4    ID#4    40.00
ID#4    ID#5    33.065
ID#5    ID#5    100.000    
ID#5    ID#4    33.065
ID#6    ID#6    100.000

我想“删除”每个具有相同 ID 的条目,但仅当百分比为 100% 时,所需的输出将如下所示:

ID#3    ID#1    100.00    
ID#4    ID#4    40.00
ID#4    ID#5    33.065
ID#5    ID#4    33.065

我试过了:

cat file.txt | awk '$3!=100.0 && $1=$2 {print $1,$2}'

但是当前两列不同时,我找不到包含案例的方法!

【问题讨论】:

    标签: linux shell awk


    【解决方案1】:
    $ awk '!($1==$2 && $3==100)' ip.txt
    ID#3    ID#1    100.00
    ID#4    ID#4    40.00
    ID#4    ID#5    33.065
    ID#5    ID#4    33.065
    
    • $1==$2 检查第一列是否与第二列相同
    • $3==100 检查第三列是否为 100
    • && 检查以上两个条件是否为真
    • !($1==$2 && $3==100) 反转组合条件
    • 也可以使用$1!=$2 || $3!=100(见https://en.wikipedia.org/wiki/De_Morgan%27s_laws

    还要注意文件可以直接传递给awk 命令。当显示的预期输出包含三列时,不确定为什么要使用 {print $1,$2}

    【讨论】:

      【解决方案2】:

      请您尝试关注一下。

      awk '($1==$2) && $NF==100{next} 1' Input_file
      

      说明:为上述代码添加详细说明。

      awk '                       ##Starting awk program from here.
      ($1==$2) && $NF==100{       ##Checking condition if $1(first field) equals to $2(2nd field) AND $NF(last field) equals 100 then do following.
        next                      ##next will SKIP all further statements from here.
      }                           ##Closing BLOCK for above condition here.
      1                           ##Mentioning 1 will print edited/non-edited lines here.
      ' Input_file                ##Mentioning Input_file name here.
      

      【讨论】:

      • 首先感谢您的及时回复。不幸的是,这不是我想要的。您的建议的输出是 $1 = $2 = 100.00。我正在寻找的是从我的文件中删除格式为 $1 = $2 = 100.00 的每个条目。
      • @KGee,我也为上面的代码添加了详细的解释,以防有任何疑问让我知道。
      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 2015-01-03
      • 2022-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多