【问题标题】:Remove rows have duplicate value in two columns删除行在两列中有重复值
【发布时间】:2016-09-27 15:14:58
【问题描述】:

我有一个包含四列的文件

3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958
3022751,10400,10400,T029958

我想删除在第 2 列和第 3 列中有重复的行。所以我的预期输出是这样的

3022751,6656,7656,T029957
3022751,6054,7054,T029957

我的这个 awk 脚本工作正常,但没有像这样删除重复的行

awk '!x[$2,$3]++' FS=","

当前输出为

3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958

谢谢。

【问题讨论】:

  • 您为什么认为!x[$2,$3]++ 会删除 $2 == $3 的行?
  • 您的意思是删除字段二和字段三相等的行,或者消除另一行的第二列中具有相同值的所有行(第三列相同)?在您公开的情况下,这两个规则都适用。

标签: linux awk sed


【解决方案1】:
awk -F, '$2!=$3' file

阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。

【讨论】:

  • 感谢您的帮助,埃德。
【解决方案2】:

grep

$ cat ip.txt 
3022751,6656,7656,T029957
3022751,6054,7054,T029957
3022751,10400,10400,T029958
3022751,10400,10400,T029958

$ grep -vE '^[^,]+,([^,]+),\1' ip.txt 
3022751,6656,7656,T029957
3022751,6054,7054,T029957
  • ^[^,]+, 第一列和,
  • ([^,]+)捕获第二列
  • \1 反向引用捕获的组
  • 所以,如果出现这样的匹配,请不要打印该行,礼貌-v 选项

【讨论】:

  • 如果第四列的性质发生变化,这可能会删除比预期更多的行。
  • @potong, true - 我的回答完全针对给定的输入和所需的处理......可以相应地调整正则表达式或使用-P 选项用于其他情况的前瞻/后视构造.. awk/perl 在一般情况下会更好..
  • @potong,经过进一步分析,发现我之前的正则表达式也会删除第 3 列和第 4 列相同的行。所以现在修改为仅限制第 2 列和第 3 列匹配。谢谢: )
猜你喜欢
  • 2014-10-07
  • 2022-01-17
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2018-11-27
  • 2022-01-11
  • 2020-03-17
  • 1970-01-01
相关资源
最近更新 更多