【问题标题】:awk to remove lines with multiple duplicated columns fields but with certain pattern in other column fieldawk 删除具有多个重复列字段但在其他列字段中具有特定模式的行
【发布时间】:2019-11-20 14:04:50
【问题描述】:

基本上,如果前 3 列具有相同的值,我想保留所有没有第四列值 =“-”的行。在这种情况下,我想删除第一行,但保留接下来的 2 行..

   A B C -
   A B C D1
   A B C D2
   AA BB CC D3
   AB BC CD D4
   FA FB FC -
   GA GB GC DN

预期输出:

   A B C D1
   A B C D2
   AA BB CC D3
   AB BC CD D4
   FA FB FC -
   GA GB GC DN

我能理解

   awk '!(seen[$1,$2,$3]++  && $4 == "-")'

不删除任何行,但是如何修改条件以删除第一行?

我仍然想保留“FA FB FC -”,因为没有其他行的前 3 列为“FA FB FC”。

【问题讨论】:

  • 请添加您为解决您自己的问题所做的努力。另外您的问题不清楚,请添加更多详细信息。
  • 抱歉,这不是 StackOverflow 的工作方式。 “我想做 X,请给我提示和/或示例代码”形式的问题被认为是题外话。请访问help center并阅读How to Ask,尤其是阅读Why is “Can someone help me?” not an actual question?
  • 感谢您的努力。仍然不清楚@td17 你需要有 3 个相同的列值以及字段数应该等于或大于 4 对吗?
  • 前3个字段有什么用?您可以只检查最后一个字段。
  • 编辑了帖子,希望它更有意义..

标签: awk sed


【解决方案1】:

要删除第 4 个字段为 - 的行,您可以这样做。

awk 'FNR==NR{a[$1,$2,$3]++;next} a[$1,$2,$3]>1 && $4=="-"' Input_file Input_file

【讨论】:

  • @RavinderSingh13 再次感谢。我只想删除具有 4th field value = "-" 的行,如果有另一列具有相同的前 3 列值..
  • @td17,好的,现在我明白了,请检查我编辑的解决方案并让我知道,注意 Input_file 在这里被读取了 2 次。
  • 谢谢!这行得通。我做了一些更改,因为我想保留第 2-4 行: awk 'FNR==NR{a[$1,$2,$3]++;next} !(a[$1,$2,$3]>1 && $4= ="-")' .
  • @td17,一旦有人在 SO stackoverflow.com/help/someone-answers 上得到答案,请看这里应该做什么@欢呼。
【解决方案2】:

这可能对你有用(GNU sed):

sed -E ':a;N;/^(\s*(\s\S+){3})\s-\n\1/D;s/^((\s*(\s\S+){3}).*)\n\2\s-$/\1/;ta;P;D' file

将下一行添加到当前行,如果第一行的前三个字段与第二行的前三个字段匹配并且第一行的第四个字段是-,则删除第一行并重复。但是,如果第一行的前三个字段与第二行的前三个字段匹配,并且第二行的第四个字段是-,则将两行都替换为第一行并重复。否则,打印然后删除第一行并重复。

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2011-07-25
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多