使用shell脚本实现文本拆分
需求说明
在bash中,我们可以使用split命令轻松实现文本的拆分。现在增加两点需求:
1. 在每份拆分文件的头部插入title,便于查看。
2. 拆分文件的名称为源文件名称前加编号,如1.source.txt。
总体思路
1. 执行split命令,把源文件按指定行数拆分成若干小文件。
2. 遍历这些小文件,并创建名称符合要求的拆分文件,然后插入title并拷贝文件内容。
具体步骤
1. 首先执行如下命令,人工造出一个包含9999行的大文件source.txt。
echo "" | awk ‘BEGIN{for (i = 0; i < 9999; i++) print(201503200001+i)".jpg"}‘ > source.txt
2. 假设指定行数为3000,执行如下命令,这个文件将被拆成4个小文件。
split -l 3000 source.txt
得到的4个小文件名称分别为xaa, xab, xac, xad。
3. 现在逐个创建名称符合要求的小文件,并往文件中存内容,像下面这样:
touch 1.source.txt echo "#photo_file_name">1.source.txt cat xaa>>1.source.txt
4. 最好能把冗余的文件删除,因此在完成第3步后执行rm xaa命令。
5. 主体已经有了,现在需要把它们拼起来形成一个shell脚本。
创建脚本文件split.sh并在vi中打开:
touch split.sh chmod +x split.sh
vi split.sh
编辑split.sh,输入以下内容:
#!/bin/bash # 1. 参数检查 if [ $# -ne 2 ]; then echo -e "wrong parameter\nUsage: $0 filename linecount"; exit 1; fi # 2. 拆分文件 # 2.1 清掉可能的旧文件 rm -f x?? rm -f *.$1 # 2.2 执行拆分 split -l $2 $1 # 3. 遍历小文件 xfiles=$(ls x??) index=1 for current_file in $xfiles; do new_file=$index.$1 touch $new_file # 写入title和内容 echo "#photo_file_name">$new_file cat $current_file>>$new_file # 删除冗余文件 rm -f $current_file # 打印小文件摘要 echo "~~~ $new_file"; head -3 $new_file echo "......" tail -2 $new_file echo "" # 文件索引加1 index=$(($index+1)) done
运行效果
widea@cnblogs:~/demo $ ./split.sh source.txt 3000 ~~~ 1.source.txt #photo_file_name 201503200001.jpg 201503200002.jpg ...... 201503202999.jpg 201503203000.jpg ~~~ 2.source.txt #photo_file_name 201503203001.jpg 201503203002.jpg ...... 201503205999.jpg 201503206000.jpg ~~~ 3.source.txt #photo_file_name 201503206001.jpg 201503206002.jpg ...... 201503208999.jpg 201503209000.jpg ~~~ 4.source.txt #photo_file_name 201503209001.jpg 201503209002.jpg ...... 201503209998.jpg 201503209999.jpg widea@cnblogs:~/demo $ ls 1.source.txt 2.source.txt 3.source.txt 4.source.txt source.txt split.sh
小提示
1. shell脚本对空格敏感,赋值时不能留空格,比如xfiles = $(ls x??)就是错误的。
2. 变量的引用必须用$符号。
3. 当出现syntax error: unexpected end of file错误,请把注意力放在syntax error,大多数情况下是脚本语法错误。(当然也不排除文件格式的问题,可在vi中输入:set fileformat查看文件格式是否为unix。)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。