awk хотят суммировать по часам и переменные

Я могу запустить это, и он отлично работает: примечание: поле $ 1 – поле даты / даты.

gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | sort | uniq -c | sort -r 57339 2014-03-21 09 54290 2014-03-21 08 54036 2014-03-21 10 53254 2014-03-21 11 52777 2014-03-21 12 50785 2014-03-21 07 49729 2014-03-21 16 44459 2014-03-21 15 43932 2014-03-21 13 43335 2014-03-21 06 40952 2014-03-21 14 40864 2014-03-21 17 

Теперь я хочу подавить первые 10 строк (это комментарии, предшествующие #), и это может измениться. Итак, мы хотим найти первые строки xx, начинающиеся с символа #.

Мы меняем сценарий на:

 gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | sort | uniq -c | sort -r | gawk -v MyID="$id" '/#/{n++}; END {print n+0}' | gawk "NR> MyID " 

но это не сработает. Если мы сделаем еще пару изменений – мы увидим желаемый результат:

 gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | gawk "NR>10" | sort | uniq -c | sort -r 

Я знаю, что могу физически ввести 10, чтобы пропустить первые 10 или 20 строк. Однако я хочу, чтобы это было рассчитанное значение.

  • Объединение трех последовательных строк с заменой
  • sed load substitute из файла
  • Сравните значения столбца со всеми значениями в другом столбце
  • удалить строки, содержащие определенный текст в файле
  • sed: заменить текст строкой, содержащей специальные символы
  • Использование sed с переменной:
  • Как использовать + в регулярном выражении в sed?
  • Извлечь абзац, разделенный на *** с помощью AWK
  • 3 Solutions collect form web for “awk хотят суммировать по часам и переменные”

    Вот код awk чтобы пропустить только исходные комментарии и затем print $1 на оставшихся строках:

     gawk -F: -vc=1 '/^[^#]/ {c=0} c==0 { print $1 }' ourlog 

    Перед запуском программы переменная c устанавливается в 1. Как только будет найдена строка без комментария, c устанавливается в ноль и остается таким же образом для остальной части выполнения. Когда c==0 , выполняется оператор печати.

    Если вы просто хотите исключить все комментарии, то код намного проще:

     gawk -F: '/^[^#]/ { print $1 }' ourlog 

    Вышеупомянутая проверяет каждую строку на регулярное выражение ^[^#] которое совпадает только с первым символом # . Если он совпадает (строка не является комментарием), то выполняется оператор печати.

    Поскольку мой оригинальный пост был отредактирован для грамматических вопросов .. Я должен разместить это как новый «ответ» …

    Вот еще один способ приблизиться к этому, и я не думал об этом до сегодняшнего утра.

     sed "/#/d" "/cygdrive/c/!chkout/ourlog" | gawk -F ":" "{print $1}" | sort | uniq -c | sort -r 

    Я не совсем уверен, что вы хотите сделать, потому что вы не показываете фактический ввод, просто требуемый результат и различные биты кода, которые используются на разных этапах. Однако я думаю, что следующее будет делать то, что вы хотите (убедитесь, что вы установили -F: в командной строке. Если нет, я попытался описать каждую часть, чтобы дать вам представление о том, как ее изменить.

     !/^#/ { # do the following on all rows that don't begin # with `#` a[$1]++ # store column 1 as the key in an array and # increment the value for each occurrence } END { # do the following after reading the entire file PROCINFO["sorted_in"] = "@ind_num_desc"; # set array traversal as numeric index descending # (requires gawk >= 4.0, otherwise, additional code # will be needed) for (i in a) { # loop through the array setting i as the index of # the current entry print a[i], i; # print the value (row count) and the index (the # row) } } 

    Я не думаю, что вам нужно передать переменную больше, потому что кажется, что она просто использовалась для определения количества начальных строк комментариев, которые нужно пропустить, но если вы хотите это сделать, вы почти получили это в своем примере, но каждый раз, когда вы invoke gawk , это новый экземпляр. Вы передали переменную в экземпляр перед тем, который ее использовал. Итак, в приведенном выше примере вам нужно будет изменить его на:

     gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog \ | sort | uniq -c | sort -r \ | gawk '/#/{n++}; END {print n+0}' \ | gawk -v MyID="$id" "NR> MyID " 

    Но все это можно комбинировать. Последние две строки просто подсчитывают строки с # и, я думаю, пытаются передать это значение другому экземпляру, но вы только что напечатали его в STDOUT, поэтому я не уверен, как это работает. Поэтому просто измените первую строку, чтобы awk пропустил эти строки:

     gawk -F: '!/^#/ { print $1 }' /cygdrive/c/counting/ourlog \ | sort | uniq -c | sort -r 

    Если это то, что вы хотите, и вы хотите избежать всех труб, то приведенный выше код будет работать.

    Interesting Posts

    Понятие wm независимых рабочих пространств

    Подготовка образа Linux на виртуальной машине

    Как я могу конвертировать локальное время в UTC date-time?

    Нажатие $ then Enter добавляет новую строку перед последним символом, а не после

    Получать среднее значение для всех строк каждые 3 столбца

    в чем разница между qsub и ./

    Назначение команды массиву в сценарии оболочки не работает?

    ошибка при использовании apt-get install для любого пакета

    почему Linux загружается только на моем компьютере, когда я добавляю pci = noacpi в grub? Должен ли я заменить свой ноутбук? Это достаточно серьезно?

    Что происходит с файлами во время установки триплекс «./configure, make, make install»?

    bash: вставлять текст в переменную без необходимости пропускать символы

    Нормально ли, что перезагрузка требуется для установки USB после обновления ядра?

    Команда «ip addr» показывает «UP», даже нет адреса, связанного с этим интерфейсом

    Как сделать снимок сайта через скрипт оболочки?

    если в переменной PATH существует 2 команды с одинаковым именем файла, которые будут выполнены?

    Linux и Unix - лучшая ОС в мире.