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