shell: разделение столбцов с помощью awk-стопов, если найдено не целое число

У меня есть файл с именем file.csv с несколькими строками и столбцами:

 API,20042017-01:00,341701,341701,480692,480692 API,20042017-02:00,293058,293058,415459,415459 API,20042017-03:00,272692,272692,388942,388942 API,20042017-04:00,279117,279115,399361,399361 API,20042017-05:00,345947,345945,495306,495306 

и я хочу рассчитать процентное значение, умножив отношение столбца 4 к столбцу 3 на 100, поэтому я набрал следующую команду:

 awk -F, '{ print $1, $2, $3, $4, ($4/$3*100), $5, $6 }' file.csv 

который дает мне требуемый результат:

 API,20042017-01:00,341701,341701,100,480692,480692 API,20042017-02:00,293058,293058,100,415459,415459 API,20042017-03:00,272692,272692,100,388942,388942 API,20042017-04:00,279117,279115,100,399361,399361 API,20042017-05:00,345947,345945,100,495306,495306 

но когда в столбце 3 есть не целое число, это приводит к ошибке:

 awk: (FILENAME=file.csv FNR=3) fatal: division by zero attempted 

и останавливает подсчет остальных строк.

Как я могу продолжить?

  • переменная конкатенация не работает?
  • Каков самый простой способ выполнить текст из хвоста в командной строке?
  • Выберите конкретный диапазон полей текстового файла
  • Проверьте, установлена ​​ли папка удаленной файловой системы
  • Как избежать проводов awk для awk?
  • Фоновый скрипт, выполняемый при входе в систему, прерывается, когда я запускаю tmux в терминале
  • Сортировка файлов в папки, в зависимости от типа файла
  • Есть ли способ отправить смс на мобильный номер с помощью сценария оболочки?
  • One Solution collect form web for “shell: разделение столбцов с помощью awk-стопов, если найдено не целое число”

    Вы можете попросить awk проверить, является ли поле числом с помощью ~ / ^ [0-9] + /.

    Вот небольшой скрипт оболочки, который демонстрирует это:

     [root@tiny ~]# cat test.sh #!/bin/bash INPUT="API,20042017-01:00,341701,341701,100,480692,480692 API,20042017-02:00,293058,293058,100,415459,415459 API,20042017-03:00,272692,272692,100,388942,388942 API,20042017-04:00,279117,279115,100,399361,399361 API,20042017-04:00,279117,FRED,100,399361,399361 API,20042017-05:00,345947,345945,100,495306,495306" echo "$INPUT" | awk -F, '$3 ~ /^[0-9]+/ && $4 ~ /^[0-9]+/ { print $1, $2, $3, $4, ($4/$3*100), $5, $6 }' [root@tiny ~]# ./test.sh API 20042017-01:00 341701 341701 100 100 480692 API 20042017-02:00 293058 293058 100 100 415459 API 20042017-03:00 272692 272692 100 100 388942 API 20042017-04:00 279117 279115 99.9993 100 399361 API 20042017-05:00 345947 345945 99.9994 100 495306 [root@tiny ~]# 
    Interesting Posts

    Есть ли (относительно) безопасный способ запуска команд CLI из Интернета?

    Сканер отпечатков пальцев обнаружен и кажется функциональным, но никогда не соответствует отпечатку пальца

    Выполнить скрипт в Syslinux

    sh-скрипт, содержащий элемент perl, не производит такой же вывод через crontab как ручное выполнение

    Не удается получить удаленный доступ к PostgreSQL

    LUKS: зашифрованное устройство намного меньше, чем его хост-раздел

    Виртуальный хост работает только тогда, когда SELinux настроен на разрешительный – почему?

    Как я могу найти неравномерные разрешения файлов в структуре каталогов?

    Создание локального репозитория yum без rpms

    Итерация повторяющегося токового цикла, если выполняется какое-либо условие (bash)

    Nginx loadbalancing между PHP-FPM и Apache

    Настройка параметров инициализации пакета пакета opendkim Debian при наличии сценариев init.d и systemctl

    Как копировать подмножество файлов из каталога, сохраняя структуру папок?

    Bash unsets * _PID переменная, прежде чем я могу ждать на coproc

    Половина букв всех слов отсутствует.

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