使用awk按照行數切割文件

 

最近在作一個事情,須要將一個文本文件按照行數進行切割,而後用了,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====="
相關文章
相關標籤/搜索