다음 형식으로 생성된 CSV가 있습니다.
unixtime;host_name;ip_adress;description;2;0;1
나는 다음을 수행하기 위해 이 csv를 구문 분석하려고 했습니다.
필드 1을 Unix 타임스탬프에서 사람이 읽을 수 있는 것으로 변경합니다.
필드 5를 2에서 키로 변경
필드 6과 7을 다음과 같이 변경합니다.
값이 0이면 NO로 바꾸고, 1이면 yes로 바꿉니다.
나는 이것으로 처음 두 가지를 성공적으로 수행했습니다.
cat test.csv |
/opt/csw/bin/gawk -F";" '{OFS=";"; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' |
/opt/csw/bin/gawk -F";" '{OFS=";"; gsub("2", "CRITICAL", $5)}1'
하지만 $6 및 $7 필드에서 1을 예로, 0을 아니요로 변경하려면 어떻게 해야 합니까?
이와 같은 것을 시도하면 0이 발견된 모든 위치가 대체됩니다.
gawk 'BEGIN {OFS=FS=";"} {if ($6== "0") gsub ($6,"NO"); print }' sample.csv
기록을 위해 저는 Solaris를 사용하고 있으며 opencsw에서 gawk를 설치했습니다.
답변1
다음 gawk
프로그램이 도움이 될 것입니다:
echo -e "unixtime;host_name;ip_adress;description;2;0;1\n1234567890;hName;hIP;hDesc;2;1;0" |
gawk -F";" 'BEGIN {OFS=";"} {
if (NR<2) next;
$1=strftime("%Y-%m-%d %H:%M:%S", $1);
$5=($5==2?"CRITICAL":$5);
$6=($6?"Yes":"No") ; $7=($7?"Yes":"No") ;
print}'
2009-02-14 00:31:30;hName;hIP;hDesc;CRITICAL;Yes;No
여기서 가장 중요한 것은 awk
한 번의 호출에 여러 명령을 넣을 수 있다는 것입니다.
$6=($6?"Yes":"No")
또는 더 공식적 (condition?consequence:alternative)
으로는 "삼항" 연산자로 알려져 있습니다.if (condition) consequence else alternative
머리글 행을 인쇄하려면끊임없는, "건너뛰기" 대신에 다음과 같이 쓸 수 있습니다.if (NR<2) {print;next} ;
편집: OFS 할당을 BEGIN 블록으로 이동하는 @cas의 성능 개선 팁을 구현했습니다.