2024-04-25 09:07:36 发布
网友
我有一个文件,上面有这样的行:
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
有什么建议吗?你知道吗
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。你知道吗
{print}
last
稍微安全一点的方法是单独处理第一行(如我最初所做的),并添加一个额外的条件:
awk '!last || $1 != last; {last = $1}' file
当第一行的第一列包含数字0时,它将在赋值之前被评估为等于last。你知道吗
0
如果第一列的内容从不重复,您可以使脚本更简单,如注释中所指出的(谢谢):
awk '!seen[$1]++' file
这只打印第一列尚未显示的行,因为seen[$1]的计算结果为false。++表示在具有相同值$1的后续行上,seen[$1]已递增,因此计算结果为true。你知道吗
seen[$1]
++
$1
或者用bash:
或使用itertools:
您可以跟踪对第一列的更改,并且仅在第一列不同时打印:
分号前面的部分有一个隐式的
{print}
操作,因此如果第一列不等于last
的值,则将打印该行(已编辑,谢谢)。分号后面的块无条件运行,并将第一列的值赋给变量last
。你知道吗稍微安全一点的方法是单独处理第一行(如我最初所做的),并添加一个额外的条件:
当第一行的第一列包含数字
0
时,它将在赋值之前被评估为等于last
。你知道吗如果第一列的内容从不重复,您可以使脚本更简单,如注释中所指出的(谢谢):
这只打印第一列尚未显示的行,因为
seen[$1]
的计算结果为false。++
表示在具有相同值$1
的后续行上,seen[$1]
已递增,因此计算结果为true。你知道吗相关问题 更多 >
编程相关推荐