代码之家  ›  专栏  ›  技术社区  ›  user306708

使用regexp的匹配值命名输出文件

  •  0
  • user306708  · 技术社区  · 14 年前

    我有一个文件“file.txt”,我想把它拆分成许多较小的文件。 这是其中的一部分:

    <代码> 0 ID:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818..
    4编号:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709..
    1 ID:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326..

    文件的每一行都有一个ID字段,对于属于ID 1的行,该字段看起来像“ID:1”。 对于文件中的每个ID,我喜欢创建一个名为id id txt的文件,并将属于此ID的所有行放入该文件中。 我的蛮力bash脚本解决方案如下。

    count=1
    而[$count-lt 19945] 做< BR> cat file.txt_grep“id:$count”>>/sets/id$count.txt
    count='expr$count+1'
    完成< /代码>

    现在这是非常低效的,因为我已经读了大约20000遍这个文件。 有没有一种方法只通过一个文件来执行相同的操作?- 我可能需要一种方法来使用与正则表达式匹配的值来命名关联的输出文件。 1编号:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326。

    文件的每一行都有一个ID字段,对于属于ID 1的行,该字段看起来像“ID:1”。 对于文件中的每个ID,我希望创建一个名为ID的文件 id .txt并将属于此ID的所有行放入该文件中。 我的蛮力bash脚本解决方案如下所示。

    计数=1
    而[$count-lt 19945] 做
    cat file.txt_grep“id:$count”>>/sets/id$count.txt
    count='expr$count+1'
    完成

    现在这是非常低效的,因为我已经读了大约20000遍这个文件。 有没有一种方法只通过一个文件来执行相同的操作?- 我可能要求的是使用与正则表达式匹配的值命名关联的输出文件的方法。

    3 回复  |  直到 14 年前
        1
  •  2
  •   ghostdog74    14 年前
    $ cat file
    0 id:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818 ..
    4 id:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709 ..
    1 id:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326 ..
    
    $ awk -F"[: ]" '{print $0 > "id_"$3".txt"}' file
    
    $ more id_2293.txt
    0 id:2293 7:0.78235 12:0.69205 17:0.79421 21:0.77818 ..
    4 id:2293 7:0.78235 8:0.97904 12:0.69205 17:0.31709 ..
    
    $ more id_2294.txt
    1 id:2294 7:0.78235 8:0.90994 17:0.49058 21:0.59326 ..
    
        2
  •  1
  •   Community kfsone    7 年前

    您可以构建类似于此的解决方案

    Creating multiple csv files from data within a csv file

        3
  •  1
  •   petersohn    14 年前

    尝试这个awk脚本:

    #!/usr/bin/awk -f
    {
        if (match($0, /id:([0-9]+)/, a))
            print $0 >> "file" a[1] ".txt";
    }