使用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。)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。