根據模式將文件拆分為多個文件

根據模式將文件拆分為多個文件

我有一個長達幾百行的大文件。該文件由特定標識符劃分為許多部分,例如“ABC”。這行「ABC」出現了 6 次,所以我想要 6 個輸出檔。我熟悉 split 和 awk,但似乎無法創建一個命令列來執行我所描述的操作,有什麼想法嗎?

這是一個例子

ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1

我想要三個文件,其中 ABC 是新文件中的第一行,並且在遇到下一個 ABC 之前結束。

答案1

使用csplit

csplit -z somefile /ABC/ '{*}'

預設情況下,輸出檔案將為xx00, xx01, ... 但您可以根據需要更改格式和編號 - 請參閱man csplit

答案2

NEEDLE=ABC
HAYSTACK=/path/to/bigfile
csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c -- $NEEDLE $HAYSTACK)-1))}"
for file in splitfile_*; do
    sed --in-place "s/$NEEDLE//" $file
done

無論您有多少個標記行實例,上面的程式碼都會根據要求分割文件,然後從結果文件中刪除標記。輸出檔案將被稱為,例如splitfile_00,,splitfile_01等等。

在呼叫結束時拆開這一點csplit:: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"我們使用子 shellgrep來獲取檔案中標記的實例數,並減去一 - 這csplit準確地告訴了它將進行多少次分割。

請注意,如所寫,如果您的標記出現在數據中,事情可能會變成梨形。

相關內容