shell命令之AWK處理多個文件


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM