簡體   English   中英

根據條件和行數將文件拆分為多個文件

[英]Split file into several files based on condition and also number of lines approximately

我有一個帶有示例的大文件,如下所示

A222, 00000, 555
A222, 00100, 555
A222, 00200, 555
A222, 00300, 555
A222, 00000, 555
A222, 00100, 555
A222, 00000, 555
A222, 00200, 555

這是一個示例文件,其中包含訂單標題(00000)和相關的訂單詳細信息(00100、00200 等)。我想拆分文件,每個文件大約有 40000 行,這樣每個文件都有訂單標題和訂單詳細信息。

我使用 GNU parallel實現了 40000 行的拆分,但我無法實現拆分以滿足確保訂單 Header 及其相關訂單詳細信息都在一行中的條件,以確保每個文件都有大約每個 40000 行

對於上面的示例文件,如果我必須每行拆分大約 5 行,我會使用下面的

parallel --pipe -N5 'cat > sample_{#}.txt' <sample.txt

但這會給我

sample1.txt
A222, 00000, 555
A222, 00100, 555
A222, 00200, 555
A222, 00300, 555
A222, 00000, 555

sample2.txt
A222, 00100, 555
A222, 00000, 555
A222, 00200, 555

它將在第一個文件中有第二個訂單 header,在第二個文件中有相關的訂單詳細信息。

期望的應該是

sample1.txt
A222, 00000, 555
A222, 00100, 555
A222, 00200, 555
A222, 00300, 555

sample2.txt
A222, 00000, 555
A222, 00100, 555
A222, 00000, 555
A222, 00200, 555

你可以試試這段代碼:

( export hdr=$(head -1 sample.txt); parallel  --pipe -N4 '{ echo "$hdr"; cat; } > sample_{#}.txt' < <(tail -n +2 sample.txt) )

我們基本上將 header 行分開並在其余行上運行拆分,同時在每個拆分文件中包含 header。

單條記錄:

cat file | parallel --pipe --recstart 'A222, 00000, 555' -n1 'echo Single record;cat'

多條記錄(最多--block-size

cat file | parallel --pipe --recstart 'A222, 00000, 555' --block-size 100 'echo Multiple records;cat'

如果“A222”不保持不變:

cat file | parallel -k --pipe --regexp --recstart '[A-Z]\d+, 00000' -N1 'echo Single record;cat'

當每個 Order Header 有很多記錄時,可以考慮簡單

csplit -z sample.txt '/00000,/' '{*}'

這將為每個訂單 Header 創建一個文件。 它不考慮約 40K 的要求,並且可能會產生非常多的文件,並且僅當您擁有有限數量(可能是 40 個?)不同的訂單標題時才是可行的解決方案。

當您確實希望在文件中組合不同的標頭時,請考慮

awk -v max=40000 '
   function flush() {
      if (last+nr>max || sample==0) {
         outfile="sample_" sample++ ".txt";
         last=0;
      }
      for (i=0;i<nr;i++) print a[i] >> outfile;
      last+=nr;
      nr=0;
   }
   BEGIN { sample=0 }
   /00000,/ { flush(); }
   {a[nr++]=$0}
   END { flush() }
   ' sample.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM