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