Найдите и замените различные столбцы с помощью awk

Nexpose довольно популярен, я верю. Это - больше системы обнаружения уязвимости от того, что я собрал. Мы использовали его в моей последней компании на CentOS Linux 6.3, и это смогло взять некоторую информацию об уязвимостях в нашей конфигурации DNS, среди прочего с минимальной требуемой установкой. Мы только использовали его в порядке эксперимента, но были впечатлены тем, что мы видели.

3
02.07.2014, 20:40
2 ответа

Вместо того, чтобы делать регрессное совпадение по второму столбцу, вы, вероятно, просто хотите провести сравнение строк. Для этого в приведенный вами пример нужно включить в сравнение одиночные кавычки, что превращает всё это в кошмар с оболочкой, цитирующей кошмар. Это дает следующее:

awk "\$2==\"'Zr1'\" { \$3=\"2.222.d0\" }
     \$2==\"'O1'\" { \$3=\"9.99d0\" }
     \$2==\"'C25'\" { \$3 =\"7.45d0\" }
     \$2==\"'H1'\" { \$3 =\"3.333d0\" }
     { print }" <UiO-66Zr-EH.mof
2
27.01.2020, 21:19

Первым вопросом здесь является то, что ваши значения цитируются. Я предлагаю вам просто удалить кавычки командой sed, а затем, если они вам действительно нужны, поместить их обратно после обработки файла командой awk. Что-то вроде

sed "s/'//g" UiO-66Zr-EH.mof | awk '{$2=q $2 q}' q="'" 

трюка выше устанавливает переменную q в ', так что q $2 q эквивалентно '$2'. Просто простой способ получить awk, чтобы поиграть с одиночными кавычками.

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

$2 is   $3 should be
---------------------
Zr1     2.008.d0
O25     -1.179d0
O1      -0.582d0
C25     -0.121d0
C13     -0.002d0
C1      0.625d0
O29     -0.741d0
H1      0.127d0
H25     0.495d0

Если это так, я бы сделал что-то вроде

$ sed "s/'//g" UiO-66Zr-EH.mof |
   awk 'BEGIN{
        c["Zr1"] = "2.008.d0";
        c["O25"] = "-1.179d0";
        c["O1"] = "-0.582d0";
        c["C25"] = "-0.121d0";
        c["C13"] = "-0.002d0";
        c["C1"] = "0.625d0";
        c["O29"] = "-0.741d0";
        c["H1"] = "0.127d0";
        c["H25"] = "0.495d0";
        }
    {if( $2 in c){$3=c[$2]; $2=q$2q}}1;' q="'" 

Объяснение

  • Изначальный sed просто удаляет все одиночные кавычки из входного файла.
  • Результат седа передается как входной в awk
  • Блок BEGIN{} выполняется до чтения файла и настраивается ассоциативный массив , содержащий ваши связки.
  • В основной программе я просто проверяю, определено ли $2 в массиве c и если да, то я заменяю $3 на соответствующее значение из массива.
  • Блок $2=q$2q просто возвращает одиночные котировки обратно вокруг $2.
  • Наконец, 1; печатает строку.

Вывод при запуске на вашем примере:

unit ntype qqatom
1 'Zr1' 2.008.d0
vibration
0
improper
0
unit ntype qqatom
2 'H1' 0.127d0
vibration
0
improper
0
unit ntype qqatom
3 'C25' -0.121d0
vibration
0
improper
0
unit ntype qqatom
4 'O1' -0.582d0
2
27.01.2020, 21:19

Теги

Похожие вопросы