2015-02-09 23 views
0

我有一個數據是這樣隔離從單一的文本文件,將多個文件在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 AND * 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或方式?我認爲最後的結果可以很容易地傳達,但是從同一個文件中分離出來並再次發現是有問題的。在此先感謝

回答

1

您可以用下面的命令(假設源文件是txt.txt嘗試:

grep "$RESULT OF strength" -A1000 txt.txt | awk '$2>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 '$2<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 '$2>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 '$2<0.01' | cut -f 1 -d' ' | xargs -I{} grep {} txt.txt | egrep "[0-9]+[[:blank:]]+1[[:blank:]]+" > test2.txt 
+0

它不會將任何東西返回到新文件。 – 2015-02-09 13:02:10

+0

它可以在我的debian上運行...無論如何,爲了以防萬一...試着改變'[[:blank:]]''以防萬一......當然,更改'txt.txt'(所有出現的)爲您的文件名... – lpg 2015-02-09 13:28:57

+0

該文件再次爲空。據我瞭解,你閱讀「$實力強度」下的完整文本,然後對其進行分類。請你解釋一下是什麼?然後我可以把它整理出來。由於它是一個單線,我不明白它可以逐行使用它並查看輸出。這將是非常有益的。謝謝 – 2015-02-09 13:35:17

2

作爲一個基本的解決方案,考慮下面的代碼:

[hamadhassan $] cat tri.awk 
#!/usr/bin/gawk -f 

BEGIN{ 
    load_state=1; 
} 


$0=="$RESULT OF strength"{ 
# print "end of load state" 
    load_state=0; 
} 

load_state==1 && NF==6{ 
# print "storing "$0 
    lut[$1]=$0; # store line in look up table: 
} 

load_state==0 && NF==2{ 
    if($2>0.0 && $2<1e-2){ 
    if($1 in lut){ 
     print lut[$1] > "Text2.txt"; 
    } 
    }else{ 
    if($1 in lut){ 
     print lut[$1] > "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 $] 

這是在CentOS 6用awk 3.1.7。

+0

它給不幸的錯誤./scr.sh:第7行:BEGIN {:command not found。可能是由於版本問題,你能否建議編輯?我正在使用x86_64 GNU/Linux – 2015-02-09 13:01:13

+0

,結果應該與我之前提到的不同質疑最後兩個突出顯示的區塊,謝謝 – 2015-02-09 13:21:21

+0

shebang需要成爲文件中的第一件事。確保在它之前沒有空格或新行(#!/ usr/bin/gawk -f) – user3065349 2015-02-10 09:51:25

相關問題