保留相关行块的第一行

时间:2014-12-04 15:21:50

标签: python bash

我有一个包含这样的行的文件:

r1  300  #keep this one
r1  200
r1  100
r1  100
r2  100  # "
r2  200
r3  200  # "
r3  100
r3  300

我只需要保留每个"阻止"的第一行。 (R1,R2,R3等)

期望的输出:

r1  300
r2  100
r3  200

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

您可以跟踪第一列的更改,只有在不同时才打印:

awk '$1 != last; {last = $1}' file

分号前面的部分有一个隐式{print}操作,因此如果第一列不等于last的值(编辑,谢谢),则会打印该行。分号后的块无条件运行,并将第一列的值分配给变量last

稍微安全一点就是单独处理第一行(正如我原先做的那样)并添加额外条件:

awk '!last || $1 != last; {last = $1}' file

这将处理第一行第一列包含数字0的情况,在分配值之前,该数字将被评估为等于last

如果第一列的内容从不重复,您可以使脚本更简单,如评论中所指出的那样(谢谢):

awk '!seen[$1]++' file

这仅打印尚未看到第一列的行,因为seen[$1]的计算结果为false。 ++表示在具有相同$1值的后续行中,seen[$1]已递增,因此计算结果为true。

答案 1 :(得分:2)

with open('path/to/input') as infile:
    curr = None
    for line in infile:
        if line == curr:
            continue
        print(line)
        curr = line

或者使用bash:

cat path/to/file | uniq

或者使用itertools:

import itertools

with open('path/to/file') as infile:
    for line,_stuff in itertools.groupby(infile):
        print(line)