第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部分会受到赞赏吗?
答案 0 :(得分:4)
这是第一个输出:
uniq -f 2 input > outputfile1