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 + удалить слово из определенной строки
  • Необходимо проанализировать таблицу двойного входа с двумя парами
  • Как искать и заменять строку символами новой строки в командной строке в файле
  • Удалить последнюю строку из файла
  • Как узнать содержимое файла XML с помощью Unix Sed / Awk?
  • Как только выводить строки, которые моложе 3 месяцев?
  • Более сжатые методы для обертывания файла, чем использование sed
  • 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 

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

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