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
~ /^[0-9]+/를 사용하여 awk에게 필드가 숫자인지 확인하도록 요청할 수 있습니다.
이를 보여주는 작은 쉘 스크립트는 다음과 같습니다.
[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 ~]#