输出文本指定行

时间:2021-11-01 21:57:50

有个数据txt格式(不要问我为什么),另一个文件保存我们关心的范围,例如:

1 4

7 10

...

表示第1行到第4行、第7行到第10行...是我们关心的。要求分别输出数据每个行区间的文本。


第一反应是

head x | tail x >> x

到后来肯定特别慢。


伪老板(菜b一枚)建议用 awk,感觉还是不够快,因为每个范围要运行一次 awk ;要是awk 参数能一边运行一边调整就好啦...


果断google之。


grep也可以;懒得看了。


sed是正解。代码稍后贴。


PS:有空还是得学学 awk, sed, 肯定有用;我一向眼神很准的 O(∩_∩)O哈哈~


--------------------------------------------------以下是补充------------------------------------------


原本以为sed可以试用,但是毕竟是模拟head,tail的行为,实测了一下,慢的要死。基本语句是

sed -n '21q;10,20p' sourcefile

不加'21q'会崩掉的。。。


搭配bash,基本能完成。先读索引文件,提取每行的start和end标识;然后在数据文件里用sed找。;前边还挺快的,基本秒过,但是越到后边越慢。


但是awk非常快。

#!/bin/awk -f
# your awk path, use `which awk`
BEGIN{
line=1
{
if(NR==FNR)
start[NR]=$1
end[NR]=$2
else
if(NR>=start[line])
{
if(NR<=end[line])
print $0 >> line".split"
else
line = line +1
}
}

运行 awk xx.awk indexfile sourcefile 搞定。


PS:TMD床上等我的排版。。。