仅当列条目与前一行的列不匹配时才有条件地打印行

时间:2014-06-19 08:06:17

标签: awk sed grep uniq

第1部分:

所以,我有一个如下所示的文件(inputfile):

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从第一个查找实例' 26'在col1中直到文件结尾,然后将其传送到uniq,删除任何在col3(相邻行)中具有重复值的行,最后sed删除包含不需要的字符串' XXX'的任何行。如果有人能够更详细地解释awk {f = 1} f部分会受到赞赏吗?

1 个答案:

答案 0 :(得分:4)

这是第一个输出:

 uniq -f 2 input > outputfile1