最近在作一个事情,须要将一个文本文件按照行数进行切割,而后用了,awk的方法,感受很好用, 记录一下。bash
脚本以下:spa
#!/bin/bash ## 文件效果: 根据行数来切割文件 ## 参数1为要切割的文件名 ## 参数2为每一个切割后文件的行数 filename=$1 fileline=$2 echo "filename=$filename" echo "fileline=$fileline" awk -v count=$fileline 'BEGIN{i=0} { print $0 > sprintf("%s_%d",FILENAME,i) ; if (NR>=(i+1)*count) { close(sprintf("%s_%d",FILENAME,i)); i++;} }' $filename echo "=====finish====="
简单解释一下, 比较重要的就是那一行awkcode
-v count=$fileline , -v 用来将变量传入blog
BEGIN中用来初始化一个变量 i, 用来记录是否须要进行换文件, 以后将每一行输入到对应的文件中,class
直到 NR>=(i+1)*count , 至关于一个文件已经写完了, 须要写入下一个文件。awk
这里须要作两件事情,先关闭以前写的文件, 若是不关闭, 会报错 awk: xxx makes too many open files , 这个表示awk 打开的文件太多了。 变量
而后将计数器加1, 这样就能够写入下一个文件了。file
运行效果,就是将 filename 切割成 filename_0 , filename_1, filename_2 等多个文件, 每一个文件都是 fileline 行, 最后一个文件,就是剩下的行数。方法
能够很简单的获得下面这个变种, 就是 根据想要切割的文件数量来进行按照行数切割。脚本
#!/bin/bash ## 根据文件数来切割 ## 参数1为要切割的文件名 ## 参数2为指望获得的文件数 filename=$1 filenum=$2
# 计算每一个文件的行数
fileline=$(( `cat $filename | wc -l ` / $filenum + 1 )) echo "filename=$filename" echo "filenum=$filenum" awk -v count=$fileline 'BEGIN{i=0} { print $0 > sprintf("%s_%d",FILENAME,i) ; if (NR>=(i+1)*count) { close(sprintf("%s_%d",FILENAME,i)); i++;} }' $filename echo "=====finish====="