(sed / awk) Извлечение значений из текста в файл csv - шаблон четных / нечетных линий - PullRequest
2 голосов
/ 24 января 2012

Мне нужно экспортировать некоторые числовые значения из заданного текстового файла ASCII и экспортировать его в определенный форматированный CSV-файл.Входной файл имеет шаблон четной / нечетной строки:

 SCF Done:  E(UHF) =  -216.432419652     A.U. after   12 cycles
 CCSD(T)= -0.21667965032D+03
 SCF Done:  E(UHF) =  -213.594303492     A.U. after   10 cycles
 CCSD(T)= -0.21379841974D+03
 SCF Done:  E(UHF) =  -2.86120139864     A.U. after    6 cycles
 CCSD(T)= -0.29007031339D+01
 and so on

Мне нужно значение нечетной строки в 5-м столбце и значение четной строки во 2-м столбце.Они должны быть напечатаны в CSV-файле, разделенном точкой с запятой, с 10 значениями в каждой строке.Таким образом, вывод должен выглядеть так:

-216.432419652;-0.21667965032D+03;-213.594303492;-0.21379841974D+03;-2.86120139864;-0.29007031339D+01; ...linebreak after 5 pairs of values

Я начал с awk '{print $5}' и awk '{print $2}', однако мне не удалось создать шаблон, который просто действует на четные / нечетные строки.

Простой способ сделать это?

Ответы [ 4 ]

3 голосов
/ 24 января 2012

Следующий скрипт не использует большую силу awk, но сделает всю работу за вас и, надеюсь, понятен:

NR % 2 { printf $5 ";" }
NR % 2 == 0 { printf $2 ";" }
NR % 10 == 0 { printf "\n" }
END { printf "\n" }

Использование (сохраните вышеуказанное как script.awk):

awk -f script.awk input.txt
1 голос
/ 24 января 2012

Учитывая файл с именем data.txt, попробуйте:

awk '/SCF/{ printf $5 ";"; } /CCSD/{ printf($2); } NR % 10 == 0 { printf "\n"; }' data.txt
1 голос
/ 24 января 2012

Как-то так может сработать -

awk '{x = NF > 3 ? $5 : $2 ; printf("%s;",x)}(NR % 10 == 0){print OFS}' file
     |_____________________|       |________| |___________||_________|
               |                        |           |           |
     This is a `ternary operator`,  Print with `NR` is a    `OFS` is another built-in
  what it does is checks the line  formatting  a built-in    that has a default value of
  for number of fields (`NF`). If    to add    that keeps    `\n`
 the number of fields is more than    a ";"    track of 
 3, we assign $5 value to variable x          number of lines.
      else we assign $2 value                 We are using modulo  
                                             operator to check when
                                             10 lines are crossed.
0 голосов
/ 24 января 2012

Это может работать для вас:

 tr -s ' ' ',' <file | paste -sd',\n' | cut -d, -f5,11 | paste -sd',,,,\n'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...