《這是知識點》之Linux下分割文件並保留文件頭

這是一個知識點

方便快捷的給結構化數據文件分割大小並保留文件的表頭,幾十個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

關注公衆號:開發者的花花世界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章