将数值结果从单个文本文件分离到 linux 中的多个文件
Segregation of numerical results from a single text file to multiple files in linux
我有这样的数据
#start
#gatherData
*ELEMENT_SHELL
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48715 1 50589 50590 50620 50615
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
*END
$PresentData
$RESULT OF strength
48709 1.0267261e-002
48710 1.0721873e-002
48711 1.1930415e-002
48712 1.2186395e-002
48715 9.7443219e-003
48716 1.0036242e-002
48717 1.1186538e-002
48721 7.9333931e-003
48722 8.6850608e-003
48723 8.9872172e-003
我想做的是首先检查下的所有结果
$强度结果
第二列中的哪些数字位于 0 和 1e-002 之间,然后根据该数字搜索 *ELEMENT_SHELL 和 *END 之间的数字并将整行发送到新文本文件 test1.txt .如果数字在 1e-002 到 1e-003 之间到下一个文本文件 test2.txt 并将这个单个文件分成两个不同的文件。
Text1.text 会
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
Text2.txt 会
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
48715 1 50589 50590 50620 50615
哪位高手能推荐一下SED,或者AWk的方法吗?我认为最终结果可以很容易地通过管道传输,但是从同一个文件中分离并再次找到它是有问题的。提前致谢
作为基本解决方案,请考虑以下代码:
[hamadhassan $] cat tri.awk
#!/usr/bin/gawk -f
BEGIN{
load_state=1;
}
[=10=]=="$RESULT OF strength"{
# print "end of load state"
load_state=0;
}
load_state==1 && NF==6{
# print "storing "[=10=]
lut[]=[=10=]; # store line in look up table:
}
load_state==0 && NF==2{
if(>0.0 && <1e-2){
if( in lut){
print lut[] > "Text2.txt";
}
}else{
if( in lut){
print lut[] > "Text1.txt";
}
}
}
[hamadhassan $]
给定您的示例输入:
[hamadhassan $] cat test.in
#start
#gatherData
*ELEMENT_SHELL
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48715 1 50589 50590 50620 50615
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
*END
$PresentData
$RESULT OF strength
48709 1.0267261e-002
48710 1.0721873e-002
48711 1.1930415e-002
48712 1.2186395e-002
48715 9.7443219e-003
48716 1.0036242e-002
48717 1.1186538e-002
48721 7.9333931e-003
48722 8.6850608e-003
48723 8.9872172e-003[hamadhassan $]
给出:
[hamadhassan $] ./tri.awk test.in
[hamadhassan $] cat Text2.txt
48715 1 50589 50590 50620 50615
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
[hamadhassan $] cat Text1.txt
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
[hamadhassan $]
这是在带有 awk 3.1.7 的 CentOS 6 上进行的。
你可以用下面的命令试试(假设源文件是txt.txt
:
grep "$RESULT OF strength" -A1000 txt.txt | awk '>0.01' | cut -f 1 | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test1.txt
grep "$RESULT OF strength" -A1000 txt.txt | awk '<0.01' | cut -f 1 | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test2.txt
如果列之间用空格分隔,则为:
grep "$RESULT OF strength" -A1000 txt.txt | sed 's/[\s]{2,}/\t/g' | awk '>0.01' | cut -f 1 -d' ' | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test1.txt
grep "$RESULT OF strength" -A1000 txt.txt | sed 's/[\s]{2,}/\t/g' | awk '<0.01' | cut -f 1 -d' ' | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test2.txt
我有这样的数据
#start
#gatherData
*ELEMENT_SHELL
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48715 1 50589 50590 50620 50615
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
*END
$PresentData
$RESULT OF strength
48709 1.0267261e-002
48710 1.0721873e-002
48711 1.1930415e-002
48712 1.2186395e-002
48715 9.7443219e-003
48716 1.0036242e-002
48717 1.1186538e-002
48721 7.9333931e-003
48722 8.6850608e-003
48723 8.9872172e-003
我想做的是首先检查下的所有结果 $强度结果
第二列中的哪些数字位于 0 和 1e-002 之间,然后根据该数字搜索 *ELEMENT_SHELL 和 *END 之间的数字并将整行发送到新文本文件 test1.txt .如果数字在 1e-002 到 1e-003 之间到下一个文本文件 test2.txt 并将这个单个文件分成两个不同的文件。 Text1.text 会
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
Text2.txt 会
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
48715 1 50589 50590 50620 50615
哪位高手能推荐一下SED,或者AWk的方法吗?我认为最终结果可以很容易地通过管道传输,但是从同一个文件中分离并再次找到它是有问题的。提前致谢
作为基本解决方案,请考虑以下代码:
[hamadhassan $] cat tri.awk
#!/usr/bin/gawk -f
BEGIN{
load_state=1;
}
[=10=]=="$RESULT OF strength"{
# print "end of load state"
load_state=0;
}
load_state==1 && NF==6{
# print "storing "[=10=]
lut[]=[=10=]; # store line in look up table:
}
load_state==0 && NF==2{
if(>0.0 && <1e-2){
if( in lut){
print lut[] > "Text2.txt";
}
}else{
if( in lut){
print lut[] > "Text1.txt";
}
}
}
[hamadhassan $]
给定您的示例输入:
[hamadhassan $] cat test.in
#start
#gatherData
*ELEMENT_SHELL
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48715 1 50589 50590 50620 50615
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
*END
$PresentData
$RESULT OF strength
48709 1.0267261e-002
48710 1.0721873e-002
48711 1.1930415e-002
48712 1.2186395e-002
48715 9.7443219e-003
48716 1.0036242e-002
48717 1.1186538e-002
48721 7.9333931e-003
48722 8.6850608e-003
48723 8.9872172e-003[hamadhassan $]
给出:
[hamadhassan $] ./tri.awk test.in
[hamadhassan $] cat Text2.txt
48715 1 50589 50590 50620 50615
48721 1 50623 50625 50626 50622
48722 1 50622 50626 50610 50611
48723 1 50625 50614 50613 50626
[hamadhassan $] cat Text1.txt
48709 1 50614 50616 50618 50613
48710 1 50613 50618 50608 50609
48711 1 50616 50617 50619 50618
48712 1 50618 50619 50607 50608
48716 1 50615 50620 50616 50614
48717 1 50590 50591 50621 50620
[hamadhassan $]
这是在带有 awk 3.1.7 的 CentOS 6 上进行的。
你可以用下面的命令试试(假设源文件是txt.txt
:
grep "$RESULT OF strength" -A1000 txt.txt | awk '>0.01' | cut -f 1 | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test1.txt
grep "$RESULT OF strength" -A1000 txt.txt | awk '<0.01' | cut -f 1 | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test2.txt
如果列之间用空格分隔,则为:
grep "$RESULT OF strength" -A1000 txt.txt | sed 's/[\s]{2,}/\t/g' | awk '>0.01' | cut -f 1 -d' ' | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test1.txt
grep "$RESULT OF strength" -A1000 txt.txt | sed 's/[\s]{2,}/\t/g' | awk '<0.01' | cut -f 1 -d' ' | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test2.txt