AWK 소개
9.1 awk를 호출하는 세 가지 방법
:
1. 명령줄 방법:
awk [-F file-separator] 'commands' input-files
-F 지정 구분 기호(기본값은 공백 또는 탭)
명령 awk 명령
input-files 처리할 파일
2. 모든 awk 명령을 파일에 삽입하고 awk 프로그램을 실행 가능하게 만든 다음 awk 명령 해석기를 사용합니다. 스크립트 이름을 입력하여 호출할 수 있도록 스크립트의 첫 번째 줄로 지정
3. 모든 awk 명령을 단일 파일에 삽입한 후 다음을 호출합니다.
awk -f awk-script-file input-files
-f 호출 스크립트의 이름을 지정합니다.
input-files 처리할 파일
9.2 Awk 스크립트
명령에서 awk를 호출할 때 awk 스크립트는 다양한 작업과 모드로 구성됩니다.
awk는 한 번에 하나의 레코드나 줄을 읽고 지정된 구분 기호를 사용하여 지정된 필드를 구분합니다. 새 줄이 나타나면 awk 명령은 전체 레코드를 읽었음을 확인한 후 다음 레코드에서 읽기 명령을 시작합니다. 이 읽기 프로세스는 파일이 끝나거나 파일이 더 이상 존재하지 않을 때까지 계속됩니다.
9.2.1 패턴과 액션
모든 awk 문은 패턴과 액션으로 구성됩니다. 모드 부분에서는 작업 명령문이 트리거되는 시점과 트리거 조건을 결정합니다. 처리는 데이터에 대해 수행되는 작업입니다. 모드 부분이 생략되면 작업은 항상 실행된 상태로 유지됩니다.
패턴은 두 개의 특수 필드 BEGIN 및 END를 포함하여 조건문, 복합문 또는 정규 표현식이 될 수 있습니다. BEGIN 문을 사용하여 개수와 프린트 헤드를 설정합니다. BEGIN 문은 텍스트 찾아보기 작업 전에 사용되며, 그 후에는 입력 파일을 기반으로 텍스트 찾아보기 작업이 실행되기 시작합니다. END 문은 awk가 텍스트 탐색 작업을 완료한 후 총 텍스트 수와 종료 상태 플래그를 인쇄하는 데 사용됩니다. 패턴을 지정하지 않으면 awk는 항상 일치합니다.
실제 작업은 중괄호 {} 안에 지정됩니다. 대부분의 작업은 인쇄용이지만 if 및 루프 문, 루프 종료 구조와 같은 일부 긴 코드도 있습니다. 작업이 지정되지 않으면 awk는 탐색된 모든 레코드를 인쇄합니다.
9.2.2 도메인 및 레코드
awk가 실행되면 검색 도메인이 $1, $2...$n으로 표시됩니다. 이 방법을 도메인 식별이라고 합니다. 여러 도메인을 지정해야 하는 경우 쉼표를 사용하여 구분합니다. 예를 들어 $1, $3은 첫 번째 도메인을 지정하고, 세 번째 도메인을 지정하려면 $0을 사용하면 됩니다.
인쇄 작업을 수행하려면 print 명령을 사용하세요. 이는 awk 명령이며 {}로 묶어야 합니다.
1. 도메인 추출
예: 다음 내용이 포함된 grade.txt 파일이 있습니다:
$ cat grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J . 루루 06/99 48317 녹색 9 24 26
P.Bunny 02/99 48 노란색 12 35 28
J.Troll > . -2 12 30 28
이 텍스트 파일에는 공백이 포함된 7개의 필드가 있습니다. 필드 구분 기호
2. awk 출력 저장
awk 출력을 저장하는 두 가지 방법:
파일로 리디렉션: (화면에 표시되지 않음)
$ awk '{print $0}' 등급. txt >wow
파이프를 사용하여 출력 결과를 tee에 전달합니다. (결과가 화면에 표시됨)
$ awk '{print $0}' grade.txt|tee woww
3. 표준 입력
:
$ belts.awk grade.txt
$ belts.awk < grade.txt
4. 모든 기록 인쇄
$ awk '{print $0}' grade.txt
5. 별도의 기록 인쇄
$1 및 $4만 인쇄:
$ awk '{print $1,$4}' grade.txt
6. $1 위에 설명을 추가할 수 있습니다. 및 $4, 이름 및 벨트:
$ awk 'BEGIN {print "NamettBeltn--------------- ----------"} {print $1"t" $4}' grade.txt
마지막에 종료 코멘트 추가:
$ awk 'BEGIN {print "NamettBeltn------ ------------------ --"} {print $1"t"$4} END {print "--- ---------n보고서 끝"}' grade.txt
7. awk 오류 메시지 프롬프트
awk 오류가 발생하면 그에 따라 검색할 수 있습니다.
• 전체 awk 명령이 작은 따옴표로 묶여 있는지 확인하세요.
• 따옴표가 모두 있는지 확인하세요. 명령은 쌍으로 표시됩니다.
• 작업 명령문은 중괄호 {}로 묶고 조건문은 괄호()로 묶습니다.
• 중괄호 사용을 잊었을 수 있습니다. {}
8. awk 키보드 입력
입력 파일이 제공되지 않으면 awk는 키보드에서 입력을 받고 완료되면 입력 종료를 누릅니다.
9.2.3 메타문자
^ $ . [ ] | ( ) * + ?
여기서 + 및 ?는 awk에만 적용 가능하며 grep 또는 sed에는 적용되지 않습니다.
+는 하나 이상의 선행 단일 문자와 일치합니다.
? 이전 단일 문자
의 예:
/XY+Z/ XYZ, XYYYYZ와 일치
/XY?Z/ XYZ와 일치, > < >
>= > 또는 <와 같음 🎜> ~ 정규식
과 일치 !~ 정규식
과 일치하지 않음 1. 일치
는 ~ 뒤에 정규식을 사용하여 도메인과 일치하거나 조건을 ( )
예시:
brown belt 학생의 모든 상황 쿼리 ($4가 Brown과 일치하는 행을 출력)
$ awk '{if ($4~/Brown/) print $0}' grade.txt
또는
$ awk '$0 ~ /Brown/ ' grade.txt
2. 완전 일치
조건과 정확히 일치하려면 ==를 사용하고 조건을 큰따옴표로 묶으세요.
예:
$ awk '{if ($3 == "48") print $0 }' grade.txt
3. 일치하지 않음
사용!~정규식 불일치 필드를 따르세요
예:
모두 쿼리 브라운 벨트가 아닌 학생 (브라운 라인과 일치하지 않는 $4 인쇄)
$ awk '{if ($4!~/Brown/) print $0}' grade.txt
또는
$ awk ' $0 !~ /Brown/' grade.txt
4. 비교
여러 비교 연산자가 같은 방식으로 사용되므로 예를 들어 보겠습니다.
$ awk '{if ($6 < $7 ) $1"을 다음 구성에서 더 잘 시도하세요"}' grade.txt
5. 다양한 일치
녹색 또는 녹색 일치:
$ awk '/[Gg]reen/' grade.txt
$1과 일치하는 네 번째 문자는 다음과 같습니다.
$ awk '$1 ~ /^...a/' grade.txt
Yellow 또는 Brown과 일치:
$ awk '$4 ~ /Yellow|Brown/' grade .txt
J로 시작하는 행과 일치:
$ awk '$0 ~ /^J/' grade.txt
6. 복합 표현식
복합 패턴 또는 복합 연산자는 복잡한 논리 연산을 형성하는 데 사용됩니다. 복합 표현식은 패턴 사이에 사용됩니다.
&& AND: 기호의 양쪽이 동시에 true여야 합니다.
|| OR: 기호의 양쪽 중 적어도 하나가 true여야 합니다.
! : 비반전
예:
$ awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txt
$ awk ' {if ($4 == "Yellow" || $4 ~ /Brown /) print $0}' grade.txt
9.2.5 awk 내장 변수
awk에는 환경 정보 설정을 위한 많은 내장 변수가 있습니다. 일반적으로 사용되는 것은 다음과 같습니다:
ARGC 명령줄 매개변수 수
ARGV 명령줄 매개변수 배열
ENVIRON 대기열에서 시스템 환경 변수 사용을 지원합니다
FILENAME awk가 읽은 파일 이름
FNR 번호 현재 파일에서 처리되는 레코드 줄 수
FS -F
NF와 동일한 도메인 구분 기호 설정 ‐ 스크립트의 매개변수 수입니다. ARGV는 ARGC의 매개변수 배열 배열로, 각 요소는 ARGV[n]으로 표시되며, n은 액세스하려는 명령줄 매개변수입니다.
ENVIRON은 시스템에서 설정한 환경 변수를 지원합니다. ENVIRON ["EDITOR"]="Vi"와 같은 실제 변수 이름
FILENAME은 현재 awk 스크립트에서 작동하는 파일의 파일 이름입니다.
FNR은 현재 awk 스크립트에서 작동하는 파일의 레코드 줄 수입니다. awk이며 그 값은 항상 NR보다 작거나 같습니다. 스크립트가 여러 파일에 액세스하는 경우 이 변수는 새 입력 파일마다 재설정됩니다.
FS는 명령줄의 -F와 동일하게 도메인 구분 기호를 설정하는 데 사용되며 기본값은 공백입니다. 예: 콜론을 구분 기호로 사용합니다. FS=":"
NF는 레코드 필드 수(열 수)이며, 레코드를 읽은 후에 설정됩니다. $NF는 종종 마지막 열 <🎜을 지정하는 데 사용됩니다. >OFS는 출력 레코드에 대한 필드 구분 기호를 지정하며 기본값은 공백입니다. 예: FS="-"를 출력하기 위한 구분 기호로 - 사용
ORS 및 RS는 모두 출력 레코드 구분 기호이며 기본값은 새 줄(n)입니다.
예:
다음의 레코드 수 보기 파일:
$ awk 'END {print NR}' grade.txt
모든 레코드, 줄 번호 및 총 필드 수를 인쇄하고 마지막으로 읽은 파일의 파일 이름을 인쇄합니다.
$ awk '{print NF ,NR,$0} END {print FILENAME}' grade.txt
최소 하나의 레코드와 Brown을 포함합니다:
$ awk '{if (NR > 0 && $4 ~ /Brown /) print $0}' grade .txt
NF의 강력한 기능은 변수 $PWD의 반환 값을 awk에 전달하고 해당 디렉터리를 표시하는 것입니다.
$ echo $PWD -F/ '{print $ NF}'
표시 파일 이름:
$ echo "/usr/apache/conf/httpd.conf" | awk -F/ '{print $NF}'
9.2.6 awk 연산자
awk 연산자의 기본 표현은 숫자, 문자열, 변수 필드 및 배열 요소로 나눌 수 있습니다
= += -= *= /= %= ^= 사용 사용 사용 사용 ' ' ' ' ' s ' 통해 통해 ‐ ‐ ‐‐‐ 및 ! 연합, AND, 아님
~ !~ ~ 산술 연산자
++ -- > 의 접두사 및 접미사
1. 입력 필드를 필드 변수 이름으로 설정
awk에서는 다음과 같은 경우 의미 있는 도메인 이름을 설정하는 것이 좋습니다. 패턴 일치 또는 관계 작업을 수행하는 것이 더 쉽습니다. 일반적인 변수명 설정 방법은 name=$n이며, 여기서 name은 호출되는 도메인 변수의 이름이고, n은 실제 도메인 번호이다. 여러 도메인 이름 설정은 세미콜론으로 구분하세요. (아래 ; 사용에 유의하세요.)
$ awk '{name = $1;belts = $4; if (belts ~ /Yellow/) print name" is belt "belts} 'grade .txt
2. 하나의 숫자 필드가 다른 숫자 필드보다 작은지 테스트하는 방법에는 두 가지가 있습니다.
1) BEGIN
에서 변수 이름에 값을 할당합니다. 2) 관계에서는 일반적으로 유익합니다. 연산자
에서 실제 값을 사용하여 BEGIN 부분에 값을 할당하면 awk 표현식을 변경할 때 많은 문제를 줄일 수 있습니다. 관계 연산을 사용할 때는 괄호를 사용해야 합니다. 예:
모든 대회에서 27점 미만을 획득한 모든 학생 쿼리:
$ awk '{if ($6 < 27) print $0}' grade.txt
또는
$ awk 'BEGIN { BASELINE = "27"} {if ($6 < BASELINE) print $0}' grade.txt
3. 숫자 필드 값 수정
awk에서 필드를 수정할 때 다음 사항을 기억하는 것이 중요합니다. 실제 입력 파일은 수정할 수 없으며 캐시에 저장된 awk 복사본만 수정됩니다. Awk는 변수 NR 또는 NF의 수정 추적을 반영합니다.
숫자 필드를 수정하려면 필드 식별자에 새 값을 다시 할당하기만 하면 됩니다. 예:
$ awk '{if ($1 == "M.Tansley") $6 = $6 - 1; print $1,$6,$7}' grade.txt
4. 텍스트 필드 수정
텍스트 수정 도메인이 새 문자열에 재할당됩니다. 전체 구문 주위에 문자열과 괄호에는 큰따옴표를 사용해야 합니다. 예:
$ awk '{if ($1 == "J.Troll") ($1 = "J.L.Troll"); print $1}' grade.txt
5.if 파일만 표시 용량이 매우 크고 수정된 기록이 많아 수정된 부분만 보시면 됩니다. 패턴 뒤에 중괄호 {}를 사용하면 수정된 부분만 인쇄됩니다. 패턴을 획득하고 패턴 결과에 따라 작업을 수행합니다. 예: (중괄호 위치 참고)
$ awk '{if ($1 == "J.Troll") {$1 = "J.L.Troll" print $1}}' grade.txt
6. 새 출력 도메인 생성
awk에서 데이터를 처리할 때 각 도메인을 기반으로 계산을 수행할 때 새 도메인을 생성하는 것이 좋습니다. 새 도메인을 생성하려면 새 도메인 식별자를 다른 도메인에 할당해야 합니다. 예:
grade.txt에 새 도메인 8을 생성하여 도메인의 현재 레벨 점수와 도메인의 최고 레벨 점수 간의 차이를 저장합니다.
$ awk 'BEGIN {print "NametDifference"} {if ($6 < $7) { $8 = $7 - $6; print $1,$8}}' grade.txt
또는 변수에 이해하기 쉬운 이름을 지정하십시오:
$ awk 'BEGIN {print "NametDifference"} {if ( $6 < $7) {diff = $7 - $6; print $1,diff}}' grade.txt
7. 열 값 증가
열 수를 늘리거나 실행 결과에 대한 통계를 수행하려면 . 기호 오른쪽에 있는 변수 필드의 값을 왼쪽에 할당합니다.
예:
모든 학생의 총점을 인쇄합니다(전체 파일의 합계 $6, total은 변수 이름입니다).
$ awk '(total += $6) END {print "Club 학생 총점 : "total}' grade.txt
파일이 크고 모든 기록이 아닌 결과 부분만 인쇄하려면 명령문 외부에 중괄호 {}를 추가하면 됩니다.
$ awk '{(total += $6)} END {print "Club Student total 포인트: "total}' grade.txt
현재 디렉터리에 있는 모든 파일의 크기와 합계 보기(하위 디렉터리 제외):
$ ls -l|awk '/^[^d]/ {print $9" t"$5 } {total += $5} END {print "total Bytes: "total}'
9.2.9 내장 문자열 함수
awk에는 많은 강력한 문자열 함수가 있습니다:
gsub(r,s , t) 전체 문자열 t에서 정규식 r을 만족하는 모든 문자열을 문자열 s로 대체(t를 지정하지 않으면 기본값은 $0) 발생 위치(존재하지 않으면 0)
length( s) s 문자열의 길이를 반환합니다. (s를 지정하지 않으면 기본값은 $0입니다.)
match(s,r) s 문자열에서 정규식 r의 문자열 위치를 만족하는 첫 번째 문자열을 반환합니다. (일치하는 것이 없으면 0)
split(s,a,sep) sep을 사용하여 문자열 s를 배열 a의 요소로 분리하고 배열 요소를 반환합니다. 숫자(구분자가 지정되지 않은 경우 기본값 FS와 사용법 동일)
sprint("fmt",exp) printf의 형식 지침을 사용하여 표현식 exp의 형식을 지정하고 출력합니다.
sub(r,s,t) 다음을 만족하는 첫 번째 문자열을 바꿉니다. 문자열 t에 s 문자열이 있는 정규식 r. 성공하면 1을 반환하고, 그렇지 않으면 0을 반환합니다(t가 지정되지 않으면 기본값은 $0입니다)
substr(s,p,n ) 길이가 다음과 같은 문자열을 반환합니다. P 위치의 P 위치에 있는 n (N을 지정하지 않으면 P 위치부터 모든 문자열을 반환)
TOLOWER(s) 문자열 S의 모든 대문자를 소문자로 변환하고, 변환된 문자열을 반환
toupper(s) 문자열 s의 모든 소문자를 대문자로 변환하고 변환된 문자열을 반환합니다
1. gsub(r,s,t)
정규식 r을 만족하는 모든 문자열을 문자열 s로 바꿉니다. 전체 문자열 t(t가 지정되지 않은 경우 기본값은 $0):
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt
또는
$ awk '{ if (gsub(/4842/,4899)) print $0}' grade.txt
2. Index(s,t)
는 문자열 s를 반환합니다. (그렇다면 0입니다.) 존재하지 않습니다). 문자열은 큰따옴표로 묶어야 합니다.
$ awk 'BEGIN {print index("Benny","ny")}' grade.txt
3. length(s)
s개의 문자를 반환합니다. 문자열(s가 지정되지 않은 경우 기본값은 $0):
$ awk '$1 == "J.Troll" {print length($1)" "$1}' grade.txt
$ awk ' BEGIN { print length("Kevin is a good boy.")}'
4. Match(s,r)
s 문자열에서 정규식 r을 만족하는 첫 번째 문자열의 위치를 반환합니다.
$ awk 'BEGIN {print match("ANCD",/d/)}' (0을 반환)
$ awk '$1=="J.Lulu" {print match($1,/u/)}' 등급 .txt (J.Lulu의 첫 번째 u 위치 반환: 3)
5. Split(s,a,sep)
sep을 사용하여 문자열 s를 배열 a의 요소로 분리하고 다음을 반환합니다. 배열 요소 ="123"
array[2]="456"
array[3]="789"
의 개수 6. sub(r,s,t)
s를 사용하세요. 문자열 t의 문자 문자열 대체는 정규식 r의 첫 번째 문자열을 만족하며, 성공하면 1을 반환하고, 그렇지 않으면 0을 반환합니다(t가 지정되지 않으면 기본값은 $0입니다):
$ awk '$1 == "J.Troll " {if ( sub(/26/,"29")) print}' grade.txt
7. substr(s,p,n)
문자열 s의 p 위치에서 시작하여 길이가 n인 문자열을 반환합니다. (n을 지정하지 않으면 p 위치에서 시작하는 모든 문자열이 반환됩니다.):
$ awk '$1 == "L.Tansley" {print substr($1,1,5)}' grade.txt (L 반환 .Tan)
주어진 길이 값 n이 문자열 길이보다 큰 경우 awk는 시작 위치부터 모든 문자를 반환합니다.
$ awk '$1 == "L.Tansley" {print substr($1,3 ,15)} ' grade.txt (Tansley로 반환)
n을 지정하지 않으면 awk는 시작 위치부터 모든 문자를 반환합니다:
$ awk '{print substr($1,3)}' grade. BEGIN 부분의 txt
는 문자열을 정의하고 END 부분에서 추출된 문자를 반환합니다.
$ awk 'BEGIN {STR="Kevin is a good boy."} END {print substr(STR,12,8 )}' grade.txt
8. 쉘의 문자열을 awk로 전달
$ echo "Stand-by"|awk '{print length($0)}'
파일 이름을 변수로 설정 , 파일 이름을 선택하세요:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,1,5)}'
파일 이름 접미사 가져오기:
$ STR="grade.txt"
$ echo $STR|awk ' { print substr($STR,7) }'
9.2.10 awk 출력 함수 printf
awk는 다양한 형식의 출력 함수가 있는 printf 함수를 제공합니다. 각 printf 함수(제어 형식 문자)는 % 기호로 시작하고 변환을 결정하는 문자로 끝납니다. 변환에는 세 가지 수정자가 포함되어 있습니다.
구문:
printf "형식 제어 문자", 매개변수
awk printf 수정자
- > .prec 최대 문자열 길이 또는 소수점 이하 자릿수
awk printf 형식
%c ASCII 문자
%d 정수
%e 부동 소수점 숫자(과학 표기법)
%f 부동 소수점 숫자
%g awk는 부동 소수점 변환( e 또는 f)
%o 8진수
%s 문자열
%x 16진수
사용 예:
문자 변환:
$ awk 'BEGIN {printf "%cn" ,65}' grade.txt
형식화된 출력:
모든 학생 이름과 일련 번호를 인쇄하고 이름을 남겨 두어야 합니다. 정렬, 15자 길이, 뒤에 일련 번호가 옵니다:
$ awk '{ printf "%-15s %sn",$1,$3}' grade.txt
댓글 추가:
$ awk 'BEGIN { print "NamettNumber"} {printf "%-15s %sn",$1,$3} ' grade.txt
9.2.11 awk 명령 줄에 값 전달
awk가 실행되기 전에 awk 변수에 값을 전달해야 합니다. 명령줄 아래에 변수를 배치하세요.
awk 명령 변수 = 입력 파일 값
예:
$ awk '{if ($5 < AGE) print $0}' AGE=10 grade.txt
여유 공간이 36000M 미만인 파티션 쿼리:
$ df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"t"$4}' LIMIT= 36000
awk를 사용하면 환경 변수를 전달할 수도 있습니다. 예:
현재 사용자가 로그인한 포트 쿼리:
$ who|awk '{if ($1 == user) print $1" you are connect to "$2}' user=$LOGNAME
9.2.12 Awk 스크립트 파일
은 awk 스크립트를 파일에 작성한 후 실행할 수 있습니다. awk 스크립트를 사용하면 사용할 때마다 다시 입력할 필요가 없고, 이해하기 쉽도록 주석을 추가할 수 있다는 장점이 있습니다. awk 스크립트를 예로 들어 보겠습니다.
#!/bin/awk -f
# 모든 주석 줄은 해시 '#'으로 시작해야 합니다.
# 이름: Student_total.awk
# 호출하려면: Student_total.awk grade.txt
# 클럽 학생 포인트의 총합과 평균을 인쇄합니다
# 헤더를 먼저 인쇄합니다
BEGIN{
print "StudentttDatetNumbertGradetAgetPointstMax"
print "NamettJoinedttttGainedtPoint Available"
인쇄 "============================================= == ======================="
}
# 획득한 점수를 합산
(총계) += $6)
# 처리가 완료되었으므로 이제 총점과 평균점을 인쇄해 보겠습니다
END {
print "클럽 학생 총점: " total
print "평균 클럽 학생 포인트: " total /NR
}
첫 번째 줄은 #!/bin/awk -f입니다. 이 줄이 없으면 시스템에서 awk의 위치를 알려주기 때문에 스크립트가 실행되지 않습니다. 명령어를 분리함으로써 스크립트의 가독성이 향상되고, 명령어 사이에 주석을 추가할 수 있습니다.
실행 시 스크립트 파일 뒤에 파일명을 입력하는데, 먼저 실행 권한을 부여해야 합니다.
9.2.13 awk에서 FS 변수 사용
awk 스크립트를 사용할 때 FS 변수 설정은 BEGIN 섹션에 있습니다. 그렇지 않은 경우 awk는 도메인 구분 기호가 무엇인지 알 수 없습니다.
스크립트 예: (이 스크립트는 /etc/passwd에서 첫 번째와 다섯 번째 도메인을 추출합니다)
#!/bin/awk -f
# 호출: passwd.awk /etc/passwd
# 첫 번째와 다섯 번째 필드를 인쇄합니다
BEGIN {
FS=":"}
{print $1,"t",$5}
9.2.14 awk 스크립트에 값 전달
awk 스크립트에 값을 전달하는 방법은 awk 명령줄에 값을 전달하는 방법과 거의 동일합니다. 형식은 다음과 같습니다.
awk_script var=value input_file
예:
#!/bin/awk - f
# 이름 : age.awk
# 호출: age.awk AGE=n grade.txt
# 명령줄에 제공된 연령보다 낮은 연령을 인쇄합니다
{if ($5 < AGE)
print $0}
실행 방법: (먼저 실행 권한을 부여하는 것을 잊지 마세요)
$ ./age.awk AGE=10 grade.txt
명령의 결과를 awk 스크립트에 전달하는 파이프 명령(예:
$ cat grade.txt |./ Student_total.awk
9.2.15 awk array
사용 전에 배열을 정의할 필요가 없음) , 배열 요소의 수를 지정할 필요도 없습니다. 루프는 배열에 액세스하는 데 자주 사용됩니다. 다음은 루프 유형의 기본 구조입니다.
for(배열의 요소) 인쇄 배열[요소]
예: (앞서 언급한 문자열 123#456#789)
#!/bin/awk -f
# 이름: arraytest.awk
# 배열을 인쇄합니다
BEGIN {
record="123#456#789";
Split(record,array,"#")
}
END {
for (i in array) {
print array[i]
}
}
使용/ dev/null작성:
$ ./arraytest.awk /dev/null
从指定文本里找为输入运行脚本:
#!/bin/ awk -f
# 이름: count.awk
# 호출: count.awk grade2.txt
# grade2.txt 파일을 반복하고 우리가 가지고 있는 벨트 수(노란색, 주황색, 빨간색)를 계산합니다. )
# 성인과 청소년의 수를 세어보세요
# BEGIN 시작
# FS를 설정하고 값으로 배열을 로드
BEGIN {FS="#"
# 로드 관심 있는 벨트 색상
belt["Yellow"]
belt["Orange"]
belt["Red"]
# end of BEGIN
# 학생 유형 로드
student["Junior"]
student["Senior"]
}
# 필드 1에 대해 벨트 색상을 유지하는 루프 스루 배열
# 일치하는 경우 계속 실행 total
{for (color in belt)
{if ($1 == Colour)
belt[colour]++}}
# 학생 유형을 반대하는 배열을 통한 루프
# field-2 일치하는 경우 누계를 유지합니다
{for (senior_or_junior in 학생)
{if ($2 == Senior_or_junior)
학생[senior_or_junior]++}}
# 처리가 완료되었으므로 일치 항목을 인쇄합니다..각 배열에 대해
END {for (color in belt) print "The club has", belt[color], Colour, "Belts"
for ( Senior_or_junior(학생)) 인쇄 "The club has", Student[senior_or_junior], Senior_or_junior, "students"}
BEGIN Division分设置域分隔符为#,初始化两个数组的内容素。然后处理文件先给数组命名为color,使用循环语句比对$1是否等于数组元素之一(Yellow、Orange或Red),如果匹配,依光匹配元素将运行总数保存进数组。동일한 방법은 数组senior_or_junior입니다.每一个数组使用循环语句并打印
收集awk的一些技巧方案
awk [opion] 'awk_script' input_file1 [input_file2 ...] 사용 가능한 옵션이 있습니다: <… _script。
③ -v var=value : 为awk_script设置变weight。
1、删除重复的行
#awk '!a[]++'
2 、将数据文件中的每个词的第一个字母变成大写
dingyi@backup:~$ cat test
저는 큐어입니다
Linux는 영원합니다!!!
나는 큐어입니다
awk 请教
下面是文件一,文件two
$cat file100001 20
00002 31
00003 04
00004 56
00005 94
00006 73
00007 25
00008 86
00009 19
00010 52
$cat file2
00007 28
00002 32
00004 56
00010 52
怎样的shell才能使file1、file2两个文件的$2 같은 말, 판매 금액 $0?
请大虾执教
li2002 2003-9-11 08:57
awk 알려주세요
그냥 다른 줄 알아보기 위한 거 아닌가요?
cat file1 file2|sort |uniq -u
deathcult 2003-9-11 09:15
awk 물어보세요
paste file1 file2|awk '{if(($1==$3)&&($2 !=$4))print$0 }'
bjgirl 2003-9-11 09:38
awk 문의해주세요
[code]
#!/bin/ ksh
sort -n file1> ;nf
sort -n file2>mf
paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 {print}'
rm nf mf
결과:
00002 31 00002 32
00004 04 00004 56
00007 56 00007 28
00010 94 00010 52
[/code]
킬루아 2003 -9 -11 10:05
awk 조언을 구하세요
1층으로 돌아가세요. 요즘 awk을 배우고 있는데 얻는 값은
00002 31
입니다. 00002 32
00003 04
00005 94
00006 73
00007 25
00007 28
00008 86
00009 19
00010 52
00010 52
그리고 제가 원하는 건
00002 31 32
00007 25 28
2층은 값이 없고 붙여넣기 해야 합니다 file1 file2|awk '{if ($1 == $3 && $2 != $4) print $0}'[/quote]
awk 알려주세요
답 결과가
[color=red]00002 31 32
00007 25 28
[/color]
목록 $1은 같지만 $2는 3층입니다. 다릅니다
admirer 2003-9-12 00:45
awk 조언을 구하세요
간단한 붙여넣기로 해결할 수 있는 문제가 아니라 연결된 문제 키워드로!
[코드]파일 1 정렬 >f1;파일 2 정렬 >f2; Join -j1 1 f1 f2|awk '$2 != $3'
00002 31 32
00007 25 28[/code]
killua 2003-9-12 03:30
awk 조언을 구하세요
[인용][i]"yoof"의 원본 게시물 ]join -j1 1 f1 f2 설명해주세요[/quote 게시자:[/i]
첫 번째 파일의 첫 번째 필드를 인덱스 키로 사용하여 f1과 f2 두 파일을 연결합니다
파일 처리
1. gz.txt 파일이 있습니다(급여)
4367422926350133100 Zhang San 1250.00
4367422926351220178 Li Si 1300.00
4367422926351220 546 왕얼 0
쑤우빙 1340.00
4367422926351220178 Sun June 1390.00
…… ……
요건 : 계좌번호 19자리, 이름 8자리, 급여 8자리로 정렬하고, 이름이 8자리 미만일 경우 뒤에 옵니다. 보충하기 위해 급여가 8자리 미만일 경우 급여 전에 정산됩니다. 동시에 급여가 0인 목록을 제거해야 합니다. 계정이 없는 경우 앞에 공백 19개를 추가하고 확인을 위해 급여 총액을 출력하면 다음과 같이 정리되어야 합니다.
4367422926350133100 장산 1250.00
4367422926351220178 리시 1300.00
소우빙 1340.00
436742292 6351220178 일 6월 1390.00
…… ……
awk 프로그램:
#-- ---------------------
#shgz1.sh
sblank=" "
awk '$nf!="0"' $1 > tmp.txt #월급 있는 사람 수 삭제 of 0
awk '<
if ($1!~/[0-9]/)<
printf("%-19.19s%-8.8s %8.2fn","'"$kk"'",$1,$2)> ; #계정이 없으면 공백을 채우세요
else<
printf("%- 19.19s%-8.8s%8.2fn",$1,$2,$3)>
>' tmp.txt > $2
awk '$nf~/[0-9 ]/<
sum=sum+$nf
end<
system("rm tmp.txt")
printf("the sum is%16.2f!n", sum) #총액 출력
>' $2
시스템 변수 호출 시 작은따옴표를 사용해야 합니다. awk에서 큰따옴표이면 문자열
awk '{print '$Flag'}'를 의미합니다. 결과는 abcd
awk '{print "$Flag"}'입니다. 결과는 $Flag
일치하는 줄을 제외하고 일치하는 내용을 제거하는 방법
다음과 같은 파일이 있습니다:
Query=4567879
시퀀스 jkaskdjgkjasgasa;jghsafgkas
jfaklslgjdla;;gsdakl;gd
Score 🎜>PUT-ASD-WEQER5-001789
>PUT-ASD-WEETED-001
SDAGDSDS
>PUT-ASD-WEQER5-001789
DSGTSDTEW
.....
......
. .....
이렇습니다.
점수 E
에서 > 로 시작하는 첫 번째 줄까지 모두 삭제하고 싶지만 점수 E 줄과 > 로 시작하는 첫 번째 줄은 제외합니다. ;
sed '/score E/,/^>/d' urfile
을 사용하면 확실히 작동하지 않습니다. 점수 E 줄을 입력하세요. 또한 >로 시작하는 첫 번째 줄도 삭제하세요.
어떻게 작성하나요?
처리할 파일에 여러 점수가 포함되어 있습니다. E와 >로 시작하는 첫 번째 줄이 모두 삭제됩니다.
awk -v p=1 '/score/{p=0}/>/{p=1}p' urfile
더 많은 awk 명령어와 예제 관련 글을 보시려면 PHP 중국어 홈페이지를 주목해주세요!