保持第一行与一组相关行的距离

2024-04-25 09:07:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,上面有这样的行:

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

有什么建议吗?你知道吗


Tags: 文件thisone建议r2r3keepr1
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)

您可以跟踪对第一列的更改,并且仅在第一列不同时打印:

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。你知道吗

相关问题 更多 >

    热门问题