달력

112024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

awk 한 라인으로 할수 있는 여러가지 일들!

 

1. 텍스트 파일의 전체 라인수를 계산

end { print NR}

 

2. 텍스트 파일의 특정번째 라인의 문자열을 프린트

NR== 10

 

3. 각 라인의 맨끝 단어를 프린트

{ print $NF}

 

4. 마지막 입력 라인의 마지막 필드를 프린트

{ field = $NF}

end { print field }

 

5. 4개 이상의 필드(단어)를 가지고 있는 라인을 프린트

NF> 4

 

6. 마지막 필드의 값이 4 이상인 라인을 프린트

$NF> 4

 

7. 모든 입력 라인에서의 총 필드의 갯수를 구함

{ sum= sum+ NF}

end { print sum}

 

8. ''fly''를 포함하고 있는 라인의 총수 계산

/fly/ { nlines = nlines + 1 }

end { print nlines }

 

9. 가장 긴 첫번째 필드(단어)와 그 해당 라인을 출력

$1 > max { max = $1; maxline = $0 }

end { print max, maxline }

[jj9613@s4team example1]$ awk 'BEGIN {max=-1} {if(max<NF) {max=NF;maxline=$0;print NF, $0}} END {print "max = ", max,"nmaxline = ", maxline}' awk_one.txt

3 1 2 3

4 7 7 8 9

max = 4

maxline = 7 7 8 9

 

10. 적어도 한 필드(단어)를 포함하고 있는 모든 라인을 프린트

NF> 0

[jj9613@s4team example1]$ awk '{if(NF>-1) {print NF,$0}}' awk_one.txt

3 1 2 3

1

3 4 5 6

1 2

4 7 7 8 9

3 10 11 12

awk 'BEGIN {FS=" ";RS="n"} {print NF, NR, $0}' awk_one.txt

15 1 1 2 3

4 5 6

2

7 7 8 9

10 11 12

 

11. 80문자 이상을 가진 모든 라인을 프린트

length($0) > 80

[jj9613@s4team example1]$ awk '{if(length($0)>20) {print length($0), $0}}' file2

46 comunication is a important fator in our life.

24 here is file1 text area.

 

12. 필드의 갯수와 해당 라인을 프린트

{ print NF, $0 }

[jj9613@s4team example1]$ awk '{print NF, $0}' awk_one.txt

3 1 2 3

1

3 4 5 6

1 2

4 7 7 8 9

3 10 11 12

 

13. 첫번째 두 필드를 반대로 프린트

{ print $2, $1 }

[jj9613@s4team example1]$ awk '{print $2, $1}' awk_one.txt

2 1

5 4

2

7 7

11 10

 

14. 첫번째 두 필드를 반대로 바꾼 다음, 그 라인을 프린트

{ temp = $1; $1 = $2; $2 = temp; print }

[jj9613@s4team example1]$ awk '{if(NF<2) {print " ", $1} else {temp=$1;$1=$2;$2=temp;print $0}}' awk_one.txt

2 1 3

5 4 6

2

7 7 8 9

11 10 12

 

15. 첫번째 필드는 라인 번호로 대체하여 그 라인을 프린트

{ $1 = NF; print }

[jj9613@s4team example1]$ awk '{if($1!=" ") {$1=NR} print $0}' awk_one.txt

1 2 3

2

3 5 6

4

5 7 8 9

6 11 12

 

16. 두번째 필드는 삭제한 후 라인을 프린트

{ $2=""; print }

[jj9613@s4team example1]$ awk '{$2="";print NF, NR,$0 }' awk_one.txt

3 1 1 3

2

3 3 4 6

4 2

4 5 7 8 9

3 6 10 12

[jj9613@s4team example1]$ awk '{$2="";print $0}' awk_one.txt

1 3

4 6

7 8 9

10 12

[jj9613@s4team example1]$ awk '{print $1,$2}' awk_one.txt

1 2

4 5

7 7

10 11

[jj9613@s4team example1]$ awk '{print $1}' awk_one.txt

1

4

2

7

10

[jj9613@s4team example1]$ awk '{$2="";print NF, NR}' awk_one.txt

3 1

2 2

3 3

2 4

4 5

3 6

[jj9613@s4team example1]$ awk '{print NF, NR}' awk_one.txt

3 1

1 2

3 3

1 4

4 5

3 6

 

17. 각 라인의 모든 필드를 역순으로 프린트

{ for (i=NF; i> 0; i = i-1) printf("%s ", $i)

printf("n")

}

[jj9613@s4team example1]$ awk '{for(i=NF;i>0; i=i-1) {print $i}}' awk_one.txt

3

2

1

6

5

4

2

9

8

7

7

12

11

10

 

18. 각각의 라인에 대하여 각 필드를 더한 값을 프린트

{ sum=0

for (i=1;i<=nf;i=i+1) sum=sum+$i

print sum

}

 

19. 모든 라인에 존재하는 필드를 모두 더한 값을 프린트

{ for (i=1;i<=NF;i=i+1) sum=sum+$i }

end { print sum }

 

20. 모든 라인에 대하여 각 필드의 절대값을 그 필드로 교체하여 그 라인을 프린트

{ for (i=1;i<=NF;i=i+1) if($i < 0) $i=-$i

print

}

 

[jj9613@s4team example1]$ vi addup

{total=$1+$2+$3; print NR,$0, total,total/3}

[jj9613@s4team example1]$ awk -f addup awk_two.txt

1 3 4 5 12 4

2 6 7 8 21 7

3 9 2 1 12 4

 

-f 스크립트 파일

* 스크립트를 파일에서 가져온다

* -f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다

awk 사용

명령어 옵션

파일의 전체 내용 출력

awk '{ print }' [FILE]

필드 출력

awk '{ print $1 }' [FILE]

필드 값에 임의 문자열을 같이 출력

awk '{print "STR"$1, "STR"$2}' [FILE]

지정된 문자열을 포함하는 레코드만 출력

awk '/STR/' [FILE]

특정 필드 비교를 통해 선택된 레코드만 출력

awk '$1 == 10 { print $2 }' [FILE]

특정 필드들의 구하기

awk '{sum += $3} END { print sum }' [FILE]

여러 필드들의 구하기

awk '{ for (i=2; i<=NF; i++) total += $i }; END { print "TOTAL : "total }' [FILE]

레코드 단위로 필드 평균 구하기

awk '{ sum = 0 } {sum += ($3+$4+$5) } { print $0, sum, sum/3 }' [FILE]

필드에 연산을 수행한 결과 출력하기

awk '{print $1, $2, $3+2, $4, $5}' [FILE]

레코드 또는 필드의 문자열 길이 검사

awk ' length($0) > 20' [FILE]

파일에 저장된 awk program 실행

awk -f [AWK FILE] [FILE]

필드 구분 문자 변경하기

awk -F ':' '{ print $1 }' [FILE]

awk 실행 결과 레코드 정렬하기

awk '{ print $0 }' [FILE]

특정 레코드만 출력하기

awk 'NR == 2 { print $0; exit }' [FILE]

출력 필드 너비 지정하기

awk '{ printf "%-3s %-8s %-4s %-4s %-4s\n", $1, $2, $3, $4, $5}' [FILE]

필드 최대 출력

awk '{max = 0; for (i=3; i<NF; i++) max = ($i > max) ? $i : max ; print max}' [FILE]

 

[내장 함수]

$n : 현재 레코드의 n 번째 필드 ( : 첫 번째 필드의 경우 n 1이고 두 번째 필드의 경우 n 2입니다).

$0 : 이 변수는 실행 중 현재 줄의 텍스트 내용을 포함

ARGC : 명령 줄 인수의 수

ARGIND : 명령 줄에서 현재 파일의 위치 (0부터 계산)

ARGV : 명령 줄 인수를 포함하는 배열입

CONVFMT : 숫자 변환 형식 (기본값은 % .6g)

ENVIRON : 환경 변수의 연관 배열

ERRNO : 마지막 시스템 오류에 대한 설명

FIELDWIDTHS : 필드 너비 목록 (공백 막대로 구분)

FILENAME : 현재 입력 파일의 이름

NR : 실행 중 현재 줄 번호에 해당하는 레코드 수

FNR : NR과 동일하나 현재 파일을 기준

FS : 필드 구분 기호 (기본값은 공백)

IGNORECASE : true인 경우 대소 문자를 구분하지 않는 일치가 수행

NF : 필드 수를 나타내며 실행 중 현재 필드 수에 해당 (print $NF줄의 마지막 필드를 약속)

OFMT : 숫자 출력 형식 (기본값은 % .6g)

OFS : 출력 필드 구분 기호 (기본값은 공백)

ORS : 출력 레코드 구분 기호 (기본값은 줄 바꿈)

RS : 레코드 구분 기호 (기본값은 줄 바꿈)

RSTART : 일치 함수와 일치하는 문자열의 첫 번째 위치

RLENGTH : 일치 함수와 일치하는 문자열의 길이

SUBSEP : 배열 인덱스 구분 기호 (기본값은 34)

 

* awk의 system variable

awk filename 현재파일명

fs 필드 구분자

nf 현재라인의 필드 수

nr 현재라인의 레코드 번호

ofmt 숫자 출력을 위한 포맷(예를 들어 %.6g)

ofs 출력 필드 구분자(디폴트는 blank)

ors 출력 레코드 구분자(디폴트는 newline)

rs 레코드 구분자(디폴트는 newline)

$0 전체 입력라인

$n n번째 필드의 내용(각 필드는 fs로 구분된다.)

 

 

 

* nawk argc 명령라인의 아규먼트 수

argv 명령라인의 배열

environ 환경변수배열

fnr nr과 같다. 그러나 현재 파일과 관련이 있다.

rstart match함수에 의해 매치된 문자열에서의 첫번째 위치

rlength match함수에 의해 매치된 문자열의 길이

subsep 배열 서브스크립트를 위한 문자구분자(디폴트는 34)

 

* awk 명령들

1) 수치연산

atan2 atan2(y,x)

cos cos(x)

exp exp(arg)

int int(arg)

log log(arg)

rand rand()

sin sin(x)

sqrt sqrt(arg)

srand srand(expr)

 

2) 문자열연산

gsub gsub(r,s[,t])

index index(str,substr)

length length(arg)

match match(s,r)

split split(string,array[,sep])

sub sub(r,s[,t])

substr substr(string,m[,n])

tolower tolower(str)

toupper toupper(str)

 

3) 제어문

break

continue

do/while

exit

for

if

return

while

 

4) 입출력/프로세스

close close(filename-expr)

delete delete array[element]

getline getline [var][<file]

next next

print print [args][destination]

printf printf format [, expression(s)][destination]

sprintf sprintf (format [,expression(s)])

system system(command)

 

참고사이트

https://recipes4dev.tistory.com/171

http://egloos.zum.com/kkimkh/v/3764155

 

Posted by 짜꾸미의골골몽
|