Извлечение текстовых данных с помощью утилит bash

У меня нетривиальная задача извлечь некоторые важные данные из больших журналов CSV, который выглядит как

Frame #,Residue,Internal,van der Waals,Electrostatic,Polar Solvation,Non-Polar Solv.,TOTAL
1,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
1,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
1,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
1,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
1,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472
...
2,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
2,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
2,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
2,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
2,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472
...
n,1,119.745,0.356,-132.009,-95.618,1.7886312,-105.7373688
n,2,106.093,-3.835,-182.473,40.582,0.7132608,-38.9197392
n,3,21.228,-1.744,-38.026,-7.707,1.1189664,-25.1300336
n,4,-5.717,-4.721,-30.38,-4.839,0.406512,-45.250488
n,5,70.846,-4.127,-53.317,-2.534,0.7808472,11.6488472

здесь я хотел бы выбрать указанное одно значение из 2-го столбца (#residue) и записать эволюцию (функция столбца с номером #snapshot) его последнего столбца (#total energy) в соответствии с 1-м столбцом (#frame number). Другими словами, мне нужно 1) отсортировать все данные в соответствии с первым 2-м столбцом): т.е. выбрать каждую строку, где число во втором столбце равно указанному значению (т. Е. N =27)

#Frame, #Residue

1,27, ... , # last column value which is interested for me!
2,27, ... , # last column value which is interested for me!
3,27, ... , # last column value which is interested for me!
3,27, ... , # last column value which is interested for me!

и затем извлеките соответствующие значения из его последнего столбца, чтобы в результате в журнале было только 3 столбца:

#Frame, #Residue, # Total energy

1,27, # last column value which is interested for me!
2,27, # last column value which is interested for me!
3,27, # last column value which is interested for me!
3,27, # last column value which is interested for me!

Буду благодарен за любую реализацию, используя awk и sed!

Спасибо!

Глеб

2 ответа

Чтобы извлечь строки с 27 во втором столбце, вы можете использовать grep:

  grep '^[^,]\+,27,' input.csv
        | |   |
beginning |   |
    not comma |
              repeated

Чтобы вывести только 1-й, 2-й и 8-й столбец, используйте cut:

grep '^[^,]\+,27' input.csv | cut -d, -f1,2,8
                                   |   |
                             delimiter |
                                      fields

Для сортировки файлов по второму столбцу вы можете использовать sort:

sort -t, -nk2,2 input.csv
      |   | |
delimiter | |
    numeric |
    sort    by only the second field

Вот решение awk:

awk -v n=27 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF }' input.csv
  • -v n=27 - начинается с присвоения переменной awk n Значение 27
  • BEGIN { OFS = FS = "," } - Раздел BEGIN запускается до того, как awk начнет анализировать любые данные. Здесь мы устанавливаем FS (разделитель полей) и OFS (разделитель выходных полей) на ",", так что и входные, и выходные строки будут разделены / разделены запятыми.
  • $2 == n { print $1, $2, $NF } - Для любой записи (строки), где второе поле ($2) равно n, выведите первое, второе и последнее поля.

Чтобы остановиться после m матчей:

awk -v n=27 -v m=3 'BEGIN { OFS = FS = "," } $2 == n { print $1, $2, $NF; if (++count == m) exit}' input.csv
Другие вопросы по тегам