【问题标题】:How to create multiple files based on a pattern match using sed or awk如何使用 sed 或 awk 基于模式匹配创建多个文件
【发布时间】:2016-01-13 16:16:53
【问题描述】:

我有一个输入文件,看起来像

1S6290615260715DUTCH-ALDI          ROTTERDAM, EUDOKIAPLEIN 8                          00002961999
20000010019149GRANEN                                            0000000100000001590  0000111
20000010019592ALASKA KOOLVISFILET                               0000001270000024003  0000111
20000010022614PAPRIKA 3 ST                                      0000000460000005934  0000111
1S6290615260715DUTCH-ALDI          BERGEN NH, JAN OLDENBURGLAAN                       00002962888
20000000000404BLEEKMIDDEL                                       0000000900000003150  0000222
20000000005197FRUIT                                             0000000430000005977  0000222
20000000006013ROOIBOSTHEE                                       0000000140000001246  0000222
1S6290615260715DUTCH-ALDI          DWINGELOO, HEUVELENWEG                             00002963777
20000000006469PITABROODJES                                      0000000610000004209  0000333
20000000007372SCHENKSTROOP                                      0000000210000001869  0000333
20000000007545HUISVUILZAKKEN                                    0000001080000012852  0000333
1S6290615260715DUTCH-ALDI          BARNEVELD, CATHARIJNESTEEG                         00002964666
20000000005197FRUIT + GRANEN BISCUITS                           0000000720000010008  0000444
20000000005209IJSASSORTI MINIMIX                                0000000190000003781  0000444
20000000006013ROOIBOSTHEE                                       0000000210000001869  0000444

我需要根据模式匹配将此文件分成多个文件。在这个文件中,模式行以 1S6290615260715 开头,基于我需要创建多个文件,例如

文件 1:

1S6290615260715DUTCH-ALDI          ROTTERDAM, EUDOKIAPLEIN 8                          00002961999
20000010019149GRANEN                                            0000000100000001590  0000111
20000010019592ALASKA KOOLVISFILET                               0000001270000024003  0000111
20000010022614PAPRIKA 3 ST                                      0000000460000005934  0000111

文件 2

1S6290615260715DUTCH-ALDI          BERGEN NH, JAN OLDENBURGLAAN                       00002962888
20000000000404BLEEKMIDDEL                                       0000000900000003150  0000222
20000000005197FRUIT                                             0000000430000005977  0000222
20000000006013ROOIBOSTHEE                                       0000000140000001246  0000222

等等。

使用 awk 我试过这个命令

awk '/^1S/f++ {print $0 > "file"f}' input.txt

每个文件都是用单行创建的。

请建议使用 sed 或 awk 更快的处理方式,因为我需要对 15GB 到 20GB 等非常大的文件执行此操作,并将这些拆分文件提供给 hadoop 框架以进行进一步处理。

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    你可以使用这个 awk:

    awk '/^1S/{if (f) close(f); f = "file" ++i} {print > f}' file
    

    【讨论】:

    • 它的工作,谢谢。你能解释一下“如果”和“关闭”吗
    • 我们应该使用> f 代码关闭所有打开的文件。 if(f) 仅在设置 f 变量时关闭
    • 再次感谢.. 我不知道 awk 中打开和关闭的概念.....awk '/^1S/{close("file"f);f++}{print $0 > "file"f".txt"}' file。我尝试在没有“if”的情况下稍微更改您的命令。它也可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2018-04-30
    • 2013-07-28
    相关资源
    最近更新 更多