AWK를 사용하여 표 형식 데이터의 형식을 다시 지정하는 방법은 무엇입니까?

AWK를 사용하여 표 형식 데이터의 형식을 다시 지정하는 방법은 무엇입니까?

다음 출력이 포함된 파일이 있습니다.

ora.abc.db
      1        ONLINE  ONLINE       serverA              Open
      2        ONLINE  ONLINE       serverB              Open
ora.xyz.db
      1        ONLINE  ONLINE       serverA              Open
      2        ONLINE  ONLINE       serverB              Open
      2        ONLINE  ONLINE       serverC              Open

이 파일의 형식을 다음과 같이 지정하고 싶지만 을 사용하고 싶습니다 shell script. awk를 사용할 수 있다고 생각하지만 논리가 없습니다.

abc  abc1  ONLINE serverA
abc  abc2  ONLINE serverB
xyz  xyz1  ONLINE serverA
xyz  xyz2  ONLINE serverB
xyz  xyz3  ONLINE serverC

답변1

이는 다음과 같은 방법일 수 있습니다.

$ awk '/^ora/ {split($0,a,"."); next} {print a[2], a[2]$1, $2, $4}' a
abc abc1 ONLINE serverA
abc abc2 ONLINE serverB
xyz xyz1 ONLINE serverA
xyz xyz2 ONLINE serverB
xyz xyz2 ONLINE serverC

설명하다

  • /^ora/로 시작하는 줄에 적용됩니다 ora. 여기서 split콘텐츠는 포인트를 기반으로 하며 .배열에 저장됩니다 a. 그래서 a[1]=ora, a[2]=abc, ...이고 다음 줄로 next점프합니다 .awk
  • print배열의 두 번째 필드 a와 행의 다른 요소를 인쇄합니다. $1첫 번째 필드를 선언하고 $4네 번째 필드를 선언합니다.

답변2

약간 확장되었지만 기본적으로는 동등한 스크립트:

{
if($0 ~ /^ora/)  {         # look for lines starting (^) with "ora"
    split($0, temp, ".");  # find the elements of the line an put in array
    serverName = temp[2];  # the "middle bit" - what was found between two dots
    next;                  # nothing else to do with this line
  }
else  {
    print serverName, serverName$1, $3, $4; # string together the bits
    # note that each $n corresponds to the nth "word"
    # by default fields are separated by white space
    # you can set the variable FS to something else (e.g. FS=",")
    # to deal with other formate
  }
}

파일에 넣고 server.awk입력이 있으면 log.txt다음으로 호출하십시오.

awk -f server.awk log.txt

설명이 가치를 더해주기를 바랍니다.

관련 정보