我有一个包含这样的行的文件:
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
有什么建议吗?
答案 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)