2015-02-09 4 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

он ничего не возвращает в новый файл. –

+0

он работает на моем debian ... в любом случае, попробуйте изменить '[[: blank:]]' for '[\ t]' на всякий случай ... И, конечно, измените 'txt.txt' (все вхождения) для вашего имени файла ... – lpg

+0

файл снова пуст. Насколько я понимаю, вы читаете полный текст под «$ Result of strength», а затем сортируете его. Не могли бы вы, пожалуйста, объяснить, что это? Тогда я смогу разобраться. Поскольку его один лайнер я не понимаю, чтобы использовать его по строчке и видеть вывод. Было бы очень полезно. спасибо –

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 {: команда не найдена. Возможно, из-за версии, можете ли вы предложить изменение? Я использую x86_64 GNU/Linux –

+0

, и результат должен быть другим, как я упоминал в своем вопрос двух последних выделенных блоков, спасибо –

+0

shebang должно быть первым делом в файле. Убедитесь, что перед вами нет пробелов или новых строк (#!/Usr/bin/gawk -f) – user3065349