Shell-Script
連接多個壓縮文件,跳過除第一個文件之外的所有文件的標題行
我有一組 gzip 壓縮文件,我想將它們組合成一個文件。它們都具有相同的格式。我想只保留第一個文件的標題資訊並在後續文件中跳過它。
舉個簡單的例子,我有四個相同的文件,內容如下:
$ gzcat file1.gz # header 1 2
我想結束
# header 1 2 1 2 1 2 1 2
實際上,我可以擁有不同數量的文件,因此我希望能夠以程式方式執行此操作。這是我到目前為止的非程式解決方案……
cat <(gzcat file1.gz) <(tail -q -n +2 <(gzcat file2.gz) <(gzcat file3.gz) <(gzcat file4.gz))
這個命令有效,但它是“硬編碼”來處理四個文件的,我需要將它推廣到任意數量的文件。如果有幫助,我將
bash
用作外殼。我的偏好是性能(實際上文件可能長達數百萬行),所以如果速度快,我可以接受不太優雅的解決方案。
如果您在問題中顯示的命令基本上可以工作(對於硬編碼的文件數量),那麼
first=1 for f in file*.gz do if [ "$first" ] then gzcat "$f" first= else gzcat "$f"| tail -n +2 fi done > collection_single_file
應該為你工作。我希望邏輯是相當清楚的。查看所有文件(根據您的文件名更改萬用字元)。如果它是列表中的第一個,
gzcat
它,所以你得到整個文件(包括標題)。否則,使用tail
剝離標題。處理完一個文件後,不會有其他文件是第一個。這會呼叫
tail
N -1 次,而不是僅一次(如您的答案)。除此之外,我的回答應該和你的回答一樣。