gawk를 사용하여 솔라리스에서 csv의 여러 필드를 구문 분석합니다.

gawk를 사용하여 솔라리스에서 csv의 여러 필드를 구문 분석합니다.

다음 형식으로 생성된 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의 성능 개선 팁을 구현했습니다.

관련 정보