从单个文件中提取值
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;
}
我有一个包含多行的文件;但是特定的一行包含大量信息,并且有几个重复的表达。我正在尝试提取一些特定值。例如,我首先用 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;
}