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 

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

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

  • перемещение (файл | каталог), избегая конфликтов имен файлов
  • Как проверить shellshock против удаленной машины, используя простой скрипт
  • Почему команда history ничего не делает в файле сценария?
  • Нам нужно, чтобы chmod сценарий оболочки, прежде чем он может быть rsh
  • Как я могу подавить вывод grep, чтобы он возвращал только статус выхода?
  • Bash regex, строка соответствия из двух строк
  • Простая, если команда не работает в скрипте csh
  • Сортировка файла на основе средней части
  • 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 ~]# 
    Linux и Unix - лучшая ОС в мире.