1.先寫一個AWK處理多個文件的例子
第一個文件打印第一個字段,第二個文件打印第二字段
方法一:
#!/bin/bash set -x file1=$(pwd)"/kk1" file2=$(pwd)"/kk2" awk -F' ' '{ if(FILENAME==ARGV[1]){ print $1; }else{ print $2; } }' $file1 $file2
方法二:
#!/bin/bash set -x file1=$(pwd)"/kk1" file2=$(pwd)"/kk2" :<<EOF awk -F' ' '{ if(FILENAME==ARGV[1]){ print $1; }else{ print $2; } }' $file1 $file2 EOF awk -F' ' '{ if(NR==FNR){ print $1; }else{ print $2; } }' $file1 $file2
2.AWK的重要常量
ARGC 命令行參數個數 ARGV 命令行參數排列 FILENAME awk瀏覽的文件名 FNR 瀏覽文件的行數(多個文件時,其值會置1,從新開始計數) NR 已讀的記錄數(多個文件時,其值會連續加1,不會置1) NF 瀏覽記錄的域的個數(每列的總行數) FS 設置輸入域分隔符,等價於命令行 -F選項 OFS 輸出域分隔符 ORS 輸出記錄分隔符 RS 控制輸入記錄分隔符 ENVIRON 支持隊列中系統環境變量的使用 $0變量是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。 $NF是number finally,表示最后一列的信息,跟變量NF是有區別的,變量NF統計的是每行列的總數
指定輸出格式符
1 #!/bin/bash 2 set -x 3 file1=$(pwd)"/kk1" 4 file2=$(pwd)"/kk2" 5 6 awk -F' 'BEGIN'{ 7 OFS="\t" 8 } 9 { 10 if(NR==FNR){ 11 print $1; 12 }else{ 13 print $2; 14 } 15 print NR,FNR,NF; 16 }' $file1 $file2
#!/bin/bash set -x file1=$1 file2=$2 cat $file1 awk -F ' ' 'BEGIN{ OFS="\t"; } { if(FILENAME==ARGV[1]){ arr[$1]=$1; } else{ if($1 in arr){ gsub(/\$\$/,",",$2); len=split($2,brr,",") for(i=0;i<=len;i++) { print brr[i]; } print $1,$2; } } }END{ #for(e in arr){ # print e; #} }' $file1 $file2
ps .awk單引號里面的內容需要用雙引號
3.AWK內置的常見的函數
函數 | 說明 |
gsub( Ere, Repl, [ In ] ) | 除了正則表達式所有具體值被替代這點,它和 sub 函數完全一樣地執行,。 |
sub( Ere, Repl, [ In ] ) | 用 Repl 參數指定的字符串替換 In 參數指定的字符串中的由 Ere 參數指定的擴展正則表達式的第一個具體值。sub 函數返回替換的數量。出現在 Repl 參數指定的字符串中的 &(和符號)由 In 參數指定的與 Ere 參數的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數,缺省值是整個記錄($0 記錄變量)。 |
index( String1, String2 ) | 在由 String1 參數指定的字符串(其中有出現 String2 指定的參數)中,返回位置,從 1 開始編號。如果 String2 參數不在 String1 參數中出現,則返回 0(零)。 |
length [(String)] | 返回 String 參數指定的字符串的長度(字符形式)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。 |
blength [(String)] | 返回 String 參數指定的字符串的長度(以字節為單位)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。 |
substr( String, M, [ N ] ) | 返回具有 N 參數指定的字符數量子串。子串從 String 參數指定的字符串取得,其字符以 M 參數指定的位置開始。M 參數指定為將 String 參數中的第一個字符作為編號 1。如果未指定 N 參數,則子串的長度將是 M 參數指定的位置到 String 參數的末尾 的長度。 |
match( String, Ere ) | 在 String 參數指定的字符串(Ere 參數指定的擴展正則表達式出現在其中)中返回位置(字符形式),從 1 開始編號,或如果 Ere 參數不出現,則返回 0(零)。RSTART 特殊變量設置為返回值。RLENGTH 特殊變量設置為匹配的字符串的長度,或如果未找到任何匹配,則設置為 -1(負一)。 |
split( String, A, [Ere] ) | 將 String 參數指定的參數分割為數組元素 A[1], A[2], . . ., A[n],並返回 n 變量的值。此分隔可以通過 Ere 參數指定的擴展正則表達式進行,或用當前字段分隔符(FS 特殊變量)來進行(如果沒有給出 Ere 參數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 數組中的元素用字符串值來創建。 |
tolower( String ) | 返回 String 參數指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。 |
toupper( String ) | 返回 String 參數指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。 |
sprintf(Format, Expr, Expr, . . . ) | 根據 Format 參數指定的 printf 子例程格式字符串來格式化 Expr 參數指定的表達式並返回最后生成的字符串。 |
3.1 match函數
awk 'BEGIN{str="tel:136016641842;name='sun';age=23";match(str,"age=([0-9]+)",phone);print phone[1];}'
3.2 split 將字符串分割成數組
awk 'BEGIN{k=split("100,200,400",a,",");print k;for(i=1;i<=k;i++){print a[i];}}'
3.3 gsub 字符串替換(正則表達式所有具體值被替代這點)
gsub(regular expression, subsitution string, target string);簡稱 gsub(r,s,t)
awk 'BEGIN{str="hello134world344";n=gsub(/[0-9]+/,"?",str);print n;print str}'
2
hello?world?
3.4 sub 正則表達式匹配的第一個值被替換
awk 'BEGIN{str="hello134world344";n=sub(/[0-9]+/,"?",str);print n;print str}'
1
hello?world344