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 

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

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

  • Как поймать и обработать ненулевой статус выхода в функции Bash?
  • Udev запускает сценарий спящего режима
  • Цикл между открытыми окнами с wmctrl
  • Как добавить к переменной строку в скрипте?
  • Как прочитать файл свойств в ассоциативный массив?
  • Получение файла с wget, когда имя файла может немного измениться
  • Найти все физические интерфейсы во FreeBSD
  • Сценарий оболочки, чтобы найти, какой пакет предоставляет файл на OpenBSD
  • 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

    Как проверить, доступен ли смонтированный том?

    Генерация ключей gpg на Cails live cd – почему так быстро?

    Почему записи terminfo не соответствуют требованиям?

    Как заменить символ во всех файлах .php внутри папки на OS X?

    Добавить файлы с одним слоем bash?

    поместить специальный символ или пробел, если шаблон не найден

    Несколько дистрибутивов в виртуальной машине с зашифрованным диском

    имя хоста для компьютеров в локальной сети

    Заполнение пользовательских вкладок bash с помощью подстановочных знаков

    Мне нужно запустить сценарий запуска одной строки под gnome и systemd

    LVM не подходит после перезагрузки, не смог найти устройство с uuid

    Как преобразовать многоуровневый xml в одну строку, содержащую все уровни, используя XMLSTARLET

    Как я могу проверить, что ключ PGP импортирован в RPM?

    Использование в сети Socket Buffer

    Как подключить диск к месту, которое не существует?

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