Shell脚本如何实现对一个文件按关键字行来分成若干个小文件?

如一个文件中:有5行包含关键字为FILE_TESTCASERESULT的行。那么我想把这个文件以这个关键字所在行为分割点,分割文件成5个小文件。请问大侠如何实现?----... 如一个文件中: 有5行包含关键字为FILE_TESTCASERESULT的行。那么我想把这个文件以这个关键字所在行为分割点,分割文件成5个小文件。请问大侠如何实现? ------- 初学shell的迷路人 展开
 我来答
百度网友5311d79
推荐于2017-12-15 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3224万
展开全部

五行关键字应该分割为6个文件啊?要不就是只取关键字行以下的行。

  

思路:用sed得出包含这个关键字的行的行号,然后根据行号分割文件。

#!/bin/sh
myFile=TestResult.txt
num=5
count=0
line=`sed -n '/FILE_TESTCASERESULT/=' $myFile`
for n in $line
do
   [ $count -eq 0 ] && let startLine=n+1 && continue
   let count+=1
   let endLine=n-1
   [ $count -eq $num ] && endLine=`sed -n '$=' myFile`
   sed -n "${startLine},${endLine} p;q" $myFile >result_${count}.txt
   let startLine=n+1
done

结果保存到result_1.txt,result_2.txt,result_3.txt,result_4.txt,result_5.txt五个文件中。

注:关键字行本身不保存。如果要保存关键字行,请修改代码中的 let startLine=n+1 为 startLine=$n (两处地方)。

更多追问追答
追问
我需要保存关键字行和关键字行下面的内容:我把您的代码按照你说的修改代码中的 let startLine=n+1 为 startLine=$n (两处地方)。

如果$line的值是 1 3 5 7,那么似乎这个程序有问题
追答

我的脚本是基于你说的前提:有5行包含关键字的行。你看我的代码里也设了个前提:num=5

如果行数不确定,是需要修改代码的。下面这样应该可以:

#!/bin/sh
myFile=TestResult.txt
count=0
line=(`sed -n '/FILE_TESTCASERESULT/=' $myFile`) #Save in array
num=${#line[@]} #Get array size
for n in ${line[*]}
do
   [ $count -eq 0 ] && startLine=$n && continue
   let count+=1
   let endLine=n-1
   [ $count -eq $num ] && endLine=`sed -n '$=' myFile`
   sed -n "${startLine},${endLine} p;q" $myFile >result_${count}.txt
   let startLine=n+1
done
百度网友f1edbb8
2013-08-08 · TA获得超过1048个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:525万
展开全部
#!/bin/bash
#By Spinestars
dl(){
n1=1
sed "/$cut1/=" $path1 | sed '/^[0-9]\{1,2\}$/N;s/\n/ /' | while read line
do
num=`echo $line | awk "/$cut1/{print \"$cut1\"}"`
if [[ $cut1 == $num ]];then
echo $line | sed -n 's/^[0-9]\{1,2\} //p'> "`pwd $path1`/$n1.file"
n2=$n1
n1=$[ $n1 + 1 ]
else
echo $line >> "`pwd $path1`/$n2.file"

fi
done
}
read -p "请输入文本路径(绝对路径):" path1
read -p "请输入段落分割符:" cut1
dl path1 cut1

测试文件:

[root@zyh shell]# cat test
bFILEb
111
222
cFILEc
333
444
dFILEd
555
666
eFILEe
777
888

测试结果:

[root@zyh shell]# ./test.sh 
请输入文本路径(绝对路径):/root/shell/test
请输入段落分割符:FILE
[root@zyh shell]# ls
1.file  2.file  3.file  4.file  
[root@zyh shell]# cat 1.file
bFILEb
111
222
[root@zyh shell]# cat 2.file
cFILEc
333
444
[root@zyh shell]# cat 3.file
dFILEd
555
666
[root@zyh shell]# cat 4.file
eFILEe
777
888

段落分割符可以任意,但是文本首行必须是含有段落分割符的行。如果不是,可以手动随便加一个含有段落分割符的行。 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luneng8183
2013-08-08 · TA获得超过902个赞
知道小有建树答主
回答量:606
采纳率:100%
帮助的人:514万
展开全部
awk 'BEGIN{num=1;prefix="file"}
{
if($0 ~ /FILE_TESTCASERESULT/){
print > prefix "_" num
num++
} else
print > prefix "_" num
}' file
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
510930569
2020-05-13 · 超过15用户采纳过TA的回答
知道答主
回答量:68
采纳率:0%
帮助的人:26万
展开全部
csplit -f vcard -b %02d.vcard input.txt -z '/FILE_TESTCASERESULT/+1' '{*}'
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式