Intereting Posts
Почему «slabtop -o» возвращает только первые 23 строки, когда команда передана по конвейеру? Когда мне нужно указать add_efi_memmap в качестве аргумента ядра в загрузке UEFI / EFI? Конфигурация Wilcard ssh больше не соответствует Устранение неполадок Ubuntu 16.04 при конфигурации сети NAT Может ли 32-разрядные приложения на 64-битном ядре использовать всю память? Zsh скрипт, как конкатенировать элементы массива со строкой Доступ к Linux-серверу с компьютера Windows в графическом режиме через SSH Импортируйте мой SSH-ключ в качестве под-ключа GPG для использования для аутентификации SSH ssh Невозможно договориться: «не найден соответствующий шифр», отклоняет cbc Что такое ndisc_cache? Возможно ли, чтобы завершение bash проходило через альтернативы? Ошибка lsusb – не может получить идентификатор / дескриптор устройства: ресурс временно недоступен Невозможно заблокировать логотип google в squid Мышь и клавиатура не работают при одновременном использовании Локомотив не работает в системе Debian: sl ls

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 проверить, является ли поле числом с помощью ~ / ^ [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 ~]#