将数值结果从单个文本文件分离到 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