使用awk按照行数切割文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使⽤awk按照⾏数切割⽂件
最近在做⼀个事情,需要将⼀个⽂本⽂件按照⾏数进⾏切割,然后⽤了,awk的⽅法,感觉很好⽤,记录⼀下。

脚本如下:
#!/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====="
简单解释⼀下,⽐较重要的就是那⼀⾏awk
-v count=$fileline , -v ⽤来将变量传⼊
BEGIN中⽤来初始化⼀个变量 i,⽤来记录是否需要进⾏换⽂件,之后将每⼀⾏输⼊到对应的⽂件中,
直到 NR>=(i+1)*count ,相当于⼀个⽂件已经写完了,需要写⼊下⼀个⽂件。

这⾥需要做两件事情,先关闭之前写的⽂件,如果不关闭,会报错 awk: xxx makes too many open files ,这个表⽰awk 打开的⽂件太多了。

然后将计数器加1,这样就可以写⼊下⼀个⽂件了。

运⾏效果,就是将 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====="。

相关文档
最新文档