输出文本指定行

有个数据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床上等我的排版。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值