
我有一個長達幾百行的大文件。該文件由特定標識符劃分為許多部分,例如“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
準確地告訴了它將進行多少次分割。
請注意,如所寫,如果您的標記出現在數據中,事情可能會變成梨形。