수색…


강력한 표 형식의 데이터 처리 (CSV 외)

awk 로 테이블 형식의 데이터를 처리하는 것은 입력이 올바르게 포맷 된 경우 매우 쉽습니다. 표 형식의 데이터를 생성하는 대부분의 소프트웨어는이 형식 계열의 특정 기능을 사용하며, 테이블 형식의 데이터를 처리하는 awk 프로그램은 특정 소프트웨어에서 생성 된 데이터에 고유 한 경우가 많습니다. 좀 더 일반적인 또는 강력한 솔루션이 필요한 경우, 가장 보편적 인 언어는 표 형식 데이터에있는 많은 기능을 제공하는 라이브러리를 제공합니다.

  • 첫 번째 줄의 선택적 열 이름
  • 인용 된 열 값과 인용되지 않은 열 값의 혼합
  • 다양한 구분 기호
  • 부동 소수점에 대한 지역화 된 형식

awk 를 사용하여 이러한 모든 기능을 명확하고 포괄적으로 처리 할 수는 있지만 가능한 것은 아닙니다.

표 형식 데이터에서 두 개의 열 교환

주어진 파일을 사용하여 ; 열 구분 기호로 사용됩니다. 제 1 및 제 2 칼럼을 허가하는 것은

awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'

표 형식 데이터의 한 열에있는 값의 평균 계산

주어진 파일을 사용하여 ; 열 구분 기호로 사용됩니다. 우리는 두 번째 열의 값의 평균을 다음 프로그램으로 계산합니다. 제공된 입력은 학생 그룹의 성적 목록입니다.

awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

이 프로그램의 출력은 2.125 입니다.

NR 은 처리되는 행의 번호를 보유한다는 것을 기억하십시오. 따라서 END 블록에서 파일의 총 행 수를 보유합니다.

많은 애플리케이션 (모니터링, 통계) 에서 중앙값은 훨씬 더 유용한 정보라는 것을 기억하십시오. 해당 예제를 참조하십시오.

표 형식 데이터의 특정 열 선택

우리는 파일을 다음과 같이 가정합니다. 열 구분 기호로 사용됩니다. 특정 열 세트를 선택하면 print 서술문 만 필요합니다. 예를 들어, 다음 프로그램은 입력에서 3, 4 및 7 열을 선택합니다.

awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'

인쇄 할 선을보다 신중하게 선택하는 것이 가능합니다. 다음 프로그램은 첫 번째 필드가 Alice 또는 Bob 때 해당 입력에서 3, 4 및 7 열을 선택합니다.

awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'

표 형식 데이터에서 한 열의 값 중앙값 계산

주어진 파일을 사용하여 ; 열 구분 기호로 사용됩니다. 두 번째 열의 값의 중앙값은 GNU awk 용으로 작성된 다음 프로그램으로 계산합니다. 제공된 입력은 학생 그룹의 성적 목록입니다.

gawk -F';' '{ sample[NR] = $2 }
 END {
   asort(sample);
   if(NR % 2 == 1) {
     print(sample[int(NR/2) + 1])
   } else {
     print(sample[NR/2])
   }
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF

이 프로그램의 출력은 1 입니다.

NR 은 처리되는 행의 번호를 보유한다는 것을 기억하십시오. 따라서 END 블록에서 파일의 총 행 수를 보유합니다.

awk의 많은 구현에는 배열을 정렬하는 함수가 없으므로 위의 코드를 사용하기 전에 정의해야합니다.

두 패턴 사이의 선 세트 선택

패턴 매칭은 awk { pattern } { action } 을 따르는 액션을 제어 할 때 효과적으로 사용할 수 있습니다. 패턴 매칭의 한 멋진 사용은 말할 파일에 두 패턴 사이에 여러 선택하는 것입니다 patternApatternB

$ awk '/patternA/,/patternB/' file

파일 내용이 다음과 같다고 가정하고 위의 패턴 사이에서만 선을 추출합니다.

$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6

$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB

위의 명령은 일치하는 행을 인쇄하는 것 이외의 특정 { action } 수행하지 않지만 행의 서브 세트 내의 특정 조치는 조치 블록 ( {} )과 함께 적용 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow