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 

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

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

  • Конец трубы, когда программа возвращает более 1 строки
  • Linux + заменить STRING / WORD в файле согласно правилу
  • Как я могу получить внешний IP-адрес в сценарии оболочки?
  • Pgrep возвращает несколько PID
  • Как получить двоичные представления строк в Shell?
  • подсчет нескольких шаблонов за один проход с помощью grep?
  • Длина в многострочной строке
  • Я случайно скопировал часть каталога / * to / some /, как мне исправить мою ошибку?
  • 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

    CD с перенаправлением на регистратор не работает

    Как я могу получить относительную дату на основе относительной даты командой linux date?

    как сделать файл вредоносного ПО доступным для чтения с помощью «Нет разрешения на чтение в файле» на linux ext-4?

    Что означает команда pkill -USR1 -n -x dd?

    Обработка аргументов в указанном порядке в / usr / bin / printf или Bash printf

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

    Двойная загрузка Fedora и Windows 8 дает ошибку: вам нужно сначала загрузить ядро

    globbing, sed или awk html-файлы

    Чтение пользовательского ввода с чтением

    Убрать недостающий шрифт в меню приложения

    Использование заголовков ядра реального времени для компиляции кода пользовательского пространства и заголовков по умолчанию

    Как разбить каталог файлов на подкаталоги

    Переименование сетевых интерфейсов Red Hat Enterprise Linux

    Загрузите фоновое изображение или установите цвет фона, если Konsole / Shell работает с SSH

    sed – удалить unmatched "}", ")" или "]" (только для рассматриваемой строки)

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