這是一個知識點
方便快捷的給結構化數據文件分割大小並保留文件的表頭,幾十個G的結構化文件不僅閱讀編輯麻煩,而且使用受限,因此高效的分割成小文件並保留頭行
1、分割文件
在Linux下,切割和合並文件可以使用split和cat命令來實現。
在Windows下,安裝Git Bash也可以使用split和cat命令。
分割文件的命令是split,通過輸入split --help可以查詢幫助信息。假設現在有個6GB大小的文件test.log,這裏簡單介紹下幾種分割的方式:
按大小分割文件(此處不推薦)
split -b 500m 文件 newfile
每個文件大小500m,生成的新文件的文件名是newfile後面加上按照aa,ab,ac……來排序的
比如文件有1.4G,那麼會切割出3個文件,文件名分別是newfileaa,newfileab,newfileac,沒有擴展名
新文件名可以不設置,系統默認新文件以字母x開頭,也就是說,如果命令是:
split -b 500m log.txt
那麼文件名就是xaa,xab,axc
速度比windows下的那些什麼切割軟件快太多
同時,-C參數表示按照所有行數加起來的最大字節數進行分割,同樣可以使用k或者m作爲單位,其實效果和上邊的-b差不多,只是在切割時將盡量維持每行的完整性。
另外切開的文件還能再合起來,命令是:
cat newfile* > orifile
此處不推薦的原因是因爲結構化文件按大小分割會造成結構破壞,故推薦按行分割
按行分割文件
split -l <行數> <目標文件> <切割後的文件前綴>
split -l 5000 文件 newfile
-l參數表示按照行數進行分割,即一個小文件中最多有多少行,-l number可以縮寫成-number,上邊的命令表示按照5000行一個小文件進行分割。
推薦按行分割文件,能保留行的完整性不破壞結構化文件的結構
2、給分割後的文件插入表頭行
Sed是一款流編輯工具,用來對文本進行過濾與替換操作,特別是當你想要對幾十個配置文件做統一修改時,你會感受到Sed的魅力!Sed通過一次僅讀取一行內容來對某些指令進行處理後輸出,所以Sed更適合於處理大數據文件。首先,Sed通過文件或管道讀取文件內容,但Sed默認並不直接修改源文件,而是將讀入的內容複製到緩衝區中,我們稱之爲模式空間(pattern space),所有的指令操作都是在模式空間中進行的,然後Sed根據相應的指令對模式空間中的內容進行處理並輸出結果,默認輸出至標準輸出(即屏幕上)。
Sed從文件中讀取數據,如果沒有輸入文件,則默認對標準輸入進程數據進行處理,腳本指令是第一個非“-”開頭的參數,具體語法格式如下:
sed [選項]...{腳本指令} [輸入文件]
選項 | 含義 |
---|---|
–version | 顯示sed版本 |
–help | 顯示幫助文檔 |
-n,–quit,–silent | 靜默輸出,默認情況下,sed程序在所有的腳本指令執行完畢後,將自動打印模式空間中的內容,該選項可以屏蔽自動打印。 |
-e script | 允許多個腳本指令被執行 |
-f script-file | 從文件中讀取腳本指令,對編寫自動腳本程序很實用。 |
-i,–in-place | 慎用,該選項將直接修改源文件 |
l,N | 該選項指令l指令可以輸出的行長度,l指令爲輸出非打印字符。 |
–posix | 禁用GNU sed擴展功能 |
-r | 在腳本指令中使用擴展正則表達式 |
-s,–separate | 默認情況下,sed將把輸入的多個文件名作爲一個長的連續的輸入流,而GNU sed則允許把它們當作單獨的文件 |
-u,–unbuffered | 最低限度的緩存輸入和輸出 |
因此,給分割後的文件加表頭的方法是:
sed -i "1i 字段,字段,字段,字段" 文件
1i表示第一行之前
3、批量給分割後的文件增加後綴名
由於分割後的文件默認是沒有後綴名的,故需要增加後綴名
非常簡單,例如CSV後綴
for i in *
do mv $i $i".csv"
done
完成
關注Github:1/2極客
關注博客:御前提筆小書童
關注網站:HuMingfeng
關注公衆號:開發者的花花世界