Files

如何使用關鍵字邊界分割文件

  • July 8, 2021

我有一個包含許多 vcard 的 vcf 文件。

將 vcf 文件導入到 Outlook 時,似乎只導入了第一個 vcard。

因此,我想將它們分開。

鑑於電子卡以

BEGIN:VCARD

並以

END:VCARD

將每個 vcard 拆分為自己的文件的最佳方法是什麼。

謝謝

更新

感謝所有的回复。與這種性質的問題一樣,有多種方法可以給貓剝皮。這就是我選擇我所做的那個的原因。

圍捕

這是我從每個答案中喜歡的內容以及促使我選擇其中一個的原因的綜述。

  • csplit: 我真的很喜歡這種方法的簡潔性。我只是希望它也能夠設置文件副檔名。
  • gawk: 它完成了我要求的一切。
  • paralell: 工作。但我必須安裝新東西。(它還決定在我的主目錄中創建一個新的 /bin 目錄)
  • perl: 我喜歡它根據聯繫人姓名創建 vcf。但是 -o 選項並沒有真正起作用

結論

  • 所以第一個去是perl因為它有點壞了
  • 接下來是paralell因為我必須安裝新東西
  • 接下來是csplit,因為據我所知,它無法在輸出文件上創建副檔名
  • 因此,該獎項授予 gawk,因為它是一個隨時可用且用途廣泛的實用程序,我可以稍微修改和更改文件名。也有加分cmp:)

您可以使用 awk 來完成這項工作:

$ curl -O https://raw.githubusercontent.com/qtproject/qt-mobility\
/d7f10927176b8c3603efaaceb721b00af5e8605b/demos/qmlcontacts/contents/\
example.vcf

$ gawk ' /BEGIN:VCARD/ { close(fn); ++a; fn=sprintf("card_%02d.vcf", a); 
       print "Writing: ", fn } { print $0 > fn; } ' example.vcf
Writing:  card_01.vcf
Writing:  card_02.vcf
Writing:  card_03.vcf
Writing:  card_04.vcf
Writing:  card_05.vcf
Writing:  card_06.vcf
Writing:  card_07.vcf
Writing:  card_08.vcf
Writing:  card_09.vcf

$ cat card_0* > all.vcf
$ cmp example.vcf all.vcf
$ echo $?
0

細節

awk 行的工作方式如下:a是每BEGIN:VCARD行遞增的計數器,同時使用 sprintf 構造輸出文件名(儲存在 中fn)。對於每一行,目前行 ( $0) 都附加到目前文件(命名為fn)。

最後一個echo $?表示cmp成功,即所有連接的單個文件都等於原始範例 vcf 範例。

請注意,awk 中的輸出重定向與 shell 中的工作方式不同。這意味著使用> fnawk 首先檢查文件是否已經打開。如果它已經打開,則 awk將附加到它。如果不是,則打開並截斷它。

由於這種重定向邏輯,我們必須顯式關閉隱式打開的文件,否則在輸入文件包含許多記錄的情況下,呼叫將達到打開文件限制。

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