【问题标题】:Checking if values in a specific column are the same in the same column for the line below?检查特定列中的值在下一行的同一列中是否相同?
【发布时间】:2018-05-28 23:05:55
【问题描述】:

我正在寻找一个 Linux 命令,我可以在其中比较对于单个列,下面的行是否与当前正在检查的行的值相同,如果它们同时输出这两行。我的文件是制表符分隔的。

输入示例:

line 1  1   var281  7

line 2  1   var100  80

line 3  1   var99   85

line 4  2   var281  90

line 5  2   var281  91

line 6  2   var300  61

line 7  3   var50   45

line 8  3   var99   14

line 9  3   var99   19

line 10 3   var670  80

期望的输出:

line 4  2   var281  90

line 5  2   var281  91

line 8  3   var99   14

line 9  3   var99   19

【问题讨论】:

  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: linux bash text-manipulation


【解决方案1】:

你可以使用:

sed '/^\s*$/d;s/\s[0-9][^ ]*$//g' inputfile | uniq -D -f3

这里 sed 删除空行 (^\s*$) 以及 inputfile 的最后一个字段。 Uniq 打印重复的行忽略前三个字段 (-f3)。输出是:

line 4 2 var281
line 5 2 var281
line 8 3 var99
line 9 3 var99

注意最后一个字段不打印。要打印它,您可以使用 grep:

grep "$(sed '/^\s*$/d;s/\s[0-9][^ ]*$//g' inputfile | uniq -D -f3)" inputfile

输出:

line 4 2 var281 90
line 5 2 var281 91
line 8 3 var99 14
line 9 3 var99 19

【讨论】:

  • 您能否解释一下您给定帖子中的部分:s/\s[0-9][^ ]*$
  • 感谢您的解释:)
  • 这将匹配空格 \s 后跟一个数字 [0-9] 后跟零个或多个非空格 [^ ]* 后跟行尾 $
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多