我有一个包含多行的文件;但是一个特定的行包含大量的信息,有几个重复的表达式。我试图提取一些具体的值。我首先尝试使用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
|
非常感谢提前。
干杯, 路易斯
答案 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;
}