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

使用RegExp的匹配值命名输出文件,regex,unix,shell,Regex,Unix,Shell,我有一个文件“file.txt”,我想把它分成许多更小的文件。 这是其中的一部分: 0 id:22937:0.78235 12:0.69205 17:0.79421 21:0.77818.. 4 id:22937:0.78235 8:0.97904 12:0.69205 17:0.31709.. 1 id:22947:0.78235 8:0.90994 17:0.49058 21:0.59326.. 文件的每一行都有一个id字段,对于属于id 1的行,它看起来像“id:1”。 对于文件中的每个

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


0 id:22937:0.78235 12:0.69205 17:0.79421 21:0.77818..
4 id:22937:0.78235 8:0.97904 12:0.69205 17:0.31709..
1 id:22947: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] 做
cat file.txt | grep“id:$count”>./set/id$count.txt
count='expr$count+1'
完成

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

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

$ 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 ..

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

试试这个AWK脚本:

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

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

下一次显示文件的外观下一次显示文件的外观谢谢您对文件格式的提示。我刚刚添加了一个文件片段。感谢您对文件格式的提示。我刚刚添加了一个文件片段。我试过了。获取:awk:./try.awk:第3行:在或附近出现语法错误,请重试。get:awk:./try.awk:line 3:在或附近出现语法错误,