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
}
[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 -f [AWK FILE] [FILE] |
|
awk -F ':' '{ print $1 }' [FILE] |
|
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
'Etc' 카테고리의 다른 글
[Script] for문 안에 변수 사용 (0) | 2020.09.30 |
---|---|
[Script] NTP 수동 동기화(ntpdate로 체크 후 시간차이 체크) (0) | 2020.09.14 |
[ubuntu] 16.04 Server 설치 (0) | 2020.09.08 |
[ubuntu] 우분투 기본 설정 및 명령어 (0) | 2020.09.08 |
[Script] shell if문 옵션(if문옵션 - eq,ne,ge,gtle,lt) (0) | 2020.07.18 |