从单个文件中提取值

时间:2018-03-26 16:55:27

标签: sed terminal extract

我有一个包含多行的文件;但是一个特定的行包含大量的信息,有几个重复的表达式。我试图提取一些具体的值。我首先尝试使用sed的一些命令,但没有成功。所以,我想知道你是否可以给我一些见解。

所以,在这里你有我提到的给定文件中唯一一行的一小部分:

    [...]6[&length_range={0.19
    [... a lot of more information here in between ...]
     0.01},habitat.set.prob={0.01,0.03,0.56,0.01,0.01,0.34,0.01,0.01,0.01},DLOOP.rate_median=0.04131395026396427,length=
    [...]
     10[&length_range={0.19
    [... a lot of more information here in between ...]
     0.01},habitat.set.prob={0.21,0.33,0.56,0.01,0.01,0.33,0.01,0.01,0.61},DLOOP.rate_median=0.04131395026396427,length=
    [...]

我的目标是首先在" habitat.set.prob = {"之后提取括号之间的所有值。并将它们放在一个文本文件中。

此外,重要的是提取出现在表达式之前的数字" [& length_range =]&#34 ;,在这种情况下是" 6"和" 10"。它们是" prob = {"

之后的数字集的标签

所以我要提取的数字集总是出现在" habitat.set.prob = {"和"},DLOOP.rate_median",而另一个数字(标签)总是在" [& length_range =&#34 ;;但是标签之前的表达方式不一样;实际上它是一个随机数。

目标最终是一个包含以下特征的文件:

    6 0.21,0.33,0.56,0.01,0.01,0.33,0.01,0.01,0.61
    10 0.21,0.33,0.56,0.01,0.01,0.33,0.01,0.01,0.61
    and so on …
你怎么看?这可能吗?

我从这个非常基本的命令开始,至少试图提取一组数字,但它没有工作

    sed -n "/habitat.set.prob={/,/},DLOOP.rate_median=/ p"

|嗯......我有所改善。 我至少能够得到这些值:

     awk '{gsub("habitat.set.prob={","\n");printf"%s",$0}' filename | awk -F'},' '{print $1"}"}' | grep -iv "TREE" > stats.txt

|

非常感谢提前。

干杯, 路易斯

3 个答案:

答案 0 :(得分:0)

类似的东西:

Url

第一部分'/.a./,/.b./'从模式a到b搜索,分布在多行上。 -n告诉sed默认不打印。

sed -rn '/.*[0-9]+\[&length_range=\{/,/habitat.set.prob=\{/{s/.*\b([0-9]+)\[&length_range.*/\1/p; s/.*habitat.set.prob=\{([^D]+)\},DLOOP.rate.*/\1/p}' habitat 6 0.01,0.03,0.56,0.01,0.01,0.34,0.01,0.01,0.01 10 0.21,0.33,0.56,0.01,0.01,0.33,0.01,0.01,0.61

有两个替换命令,其中p = print在花括号中。

答案 1 :(得分:0)

我不确定你是否真的挖了一点,所以没有提供完整的答案,但让我们希望这会对你有所帮助:

第一部分:获取no(你称之为标签)你没有提到是否有任何特定的模式,所以试试这个(数据是包含实际输入的文件) - 你需要研究如何获得数字并稍微调整RE

sed -n 's/.*\([0-9][0-9]*\).*length_range.*/\1/p' data

对于给出栖息地和DLOOP之间数字的另一部分:

sed -n 's/.*habitat.set.prob=\(.*\),DLOOP.*/\1/pg' data | tr '{' ' ' | tr '}' ' '

现在,尝试将其作为启动器并处理输出以获得所需的结果!

解释一下:

在第一部分 - 我试图捕捉任何东西(。*)和(。*)length_range之间的数字[你可以逃脱角色[和&通过在他们面前使用\来

在第二部分中:我在habitat.set.prob和DLOOP之间捕获模式,然后在tr中删除括号。

答案 2 :(得分:0)

#include <iostream>

using namespace std;

int main()
{
    string p = "1:2:3:4"; //input your string
    int arr[4] = {}; //create a new empty integer array to put the integers  in it
    for(int i=0, j=0; i <p.length(); i++){//loop on the string to extract integers
        if( p[i] == ':'){continue;}//if the value = ':' skip it and continue
        arr[j]=(int)p[i]-48;j++;//put the integer in the array we created

    }
    cout << "String={"<<arr[0]<<" "<<arr[1]<<" "<<arr[2]<<" "<<arr[3]<<"}";//print the array

    return 0;
}