Shell-Script

連接多個壓縮文件,跳過除第一個文件之外的所有文件的標題行

  • September 19, 2018

我有一組 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 次,而不是僅一次(如您的答案)。除此之外,我的回答應該和你的回答一樣。

引用自:https://unix.stackexchange.com/questions/469463