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

时间:2010-04-15 08:17:56

标签: regex unix shell

我有这个文件“file.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 ..
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的所有行放在该文件中。 我的暴力破解脚本解决方案如下所示。

count=1
while [ $count -lt 19945 ] do
cat file.txt | grep "id:$count " >> ./sets/id$count.txt
count='expr $count + 1'
done

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以构建类似于此

的解决方案

Creating multiple csv files from data within a csv file

答案 2 :(得分:1)

试试这个AWK脚本:

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