从单个文件中提取值

Extracting values from a single file

我有一个包含多行的文件;但是特定的一行包含大量信息,并且有几个重复的表达。我正在尝试提取一些特定值。例如,我首先用 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=]”之前的数字也很重要,在本例中为“6”和“10”。它们是"prob={"

之后的一组数字的标签

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

目标是以具有以下特征的文件结束:

    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",[=13=]}' filename | awk -F'},' '{print "}"}' | grep -iv "TREE" > stats.txt

|

非常感谢。

干杯, 路易斯

类似的东西:

sed -rn '/.*[0-9]+\[&length_range=\{/,/habitat.set.prob=\{/{s/.*\b([0-9]+)\[&length_range.*//p; s/.*habitat.set.prob=\{([^D]+)\},DLOOP.rate.*//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

第一部分 '/.a./,/.b./' 从模式 a 到 b 搜索,分布在多行中。 -n 告诉 sed 默认执行 non-printing 。

'/.a./,/.b./{s/.c./.d./p; s/.e./.f./p}'

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

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

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

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

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

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

现在,尝试以此为开端并处理您的输出以获得您想要的结果!

稍微解释一下:

在第一部分中 - 我正在尝试捕获任何 (.*) 和 (.*)length_range 之间的数字 [您可以通过在它们前面使用 \ 来转义字符 [ 和 &]

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

#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;
}