【问题标题】:Conditionally print line only when column entry doesn't match previous line's column仅当列条目与前一行的列不匹配时有条件地打印行
【发布时间】:2014-06-19 08:06:16
【问题描述】:

第 1 部分:

所以,我有一个看起来像这样的文件(输入文件):

inputfile

unimportant stuff ...
col1    col2     col3
26      ACE      0  
27      ACE      0  
28      ACE      0  
...  
32      CCY      1  
33      CCY      1  
34      CCY      1  
...  
42      NME      2  
43      NME      2  
44      NME      2  
...   
48      MMP      3  
49      MMP      3  
50      MMP      3  
...  
54      SCY      1  
55      SCY      1  
56      SCY      1  
...
65      MMP      2  
66      MMP      2  
67      MMP      2
... etc
422     XXX      0
423     XXX      1

期望的输出

outputfile1

col1    col2     col3
26      ACE      0  
32      CCY      1  
42      NME      2  
48      MMP      3  
54      SCY      1  
65      MMP      2

任何想法如何使用 awk/sed/grep(其他一些程序)来产生所需的输出?换句话说,我正在尝试开发的是一个脚本,它将在 col1 = 26 时开始,并且仅在 col3 更改时打印,直到文件结束。另外,我想删除 col2 中带有 XXX 的任何内容。

第 2 部分:

接下来,我想生成一个依赖于 outputfile1 的 col3 的新文件(outputfile2)。每次 col3 中的计数重置(或减少到 0/1 并重新开始计数)时,我想打印到 outputfile2 类似:

outputfile2

26 - 53
ACE_CCY_NME_MMP
54 - ...
SCY_MMP_...

理想情况下,它会打印

line1: "col1 entry" - "col1 entry minus 1"

line2: "all col 2 entries inbetween col2_col2_col2_col2" etc

我如何才能最好地实现这些结果?


第 1 部分已解决:

awk '$1 == "26" {f=1}f {print $0}' inputfile |  uniq -f 2 | sed '/XXX/d' > outputfile1

产生:

26      ACE      0
32      CCY      1
42      NME      2
48      MMP      3
54      SCY      1
64      MMP      2
...

说明: awk 从在 col1 中找到 '26' 的第一个实例打印到文件末尾,然后将其通过管道传送到 uniq ,它会删除 col3 中(相邻行的)具有重复值的所有行,最后 sed 删除任何包含不需要的字符串 'XXX' 的行。如果有人可以更详细地解释 awk {f=1}f 部分,将不胜感激?

【问题讨论】:

  • 嗨,Patrick,欢迎来到 Stack Overflow,感谢您提供大量示例数据,但建议您还包括迄今为止的解决方案以及为什么它不起作用。请参阅stackoverflow.com/help/on-topic 了解更多信息
  • 谢谢 CyanAngel,我应该编辑我的帖子以包含目前的解决方案,还是“回答问题”?
  • 编辑你现有的帖子,你是在添加信息来帮助这个问题,而不是回答它:)
  • 再次感谢!完成:)

标签: awk sed grep uniq


【解决方案1】:

这是第一个输出:

 uniq -f 2 input > outputfile1

【讨论】:

  • 非常感谢,说实话,我什至不知道 uniq 存在!非常感谢!
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多