Извлечение текстовых данных с помощью утилит 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
- начинается с присвоения переменной awkn
Значение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