我們經常會將2個有關聯文字檔案進行合併處理。分別從不同檔案獲取需要的列,然後,整體輸出到一起。awk進行多檔案處理時候,常常會遇到2個方面問題,第一個是怎麼樣合併多個檔案為一個檔案。第二個問題就是怎麼樣將多行合併為一行顯示。我這裡說下我的處理2種方法,還有實現思路。
例項文字:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[chengmo@centos5 shell]$ awk 'FNR==1{print "\r\n"FILENAME}{print $0}' a.txt b.txt a.txt 100 wang man 200 wangsan woman 300 wangming man 400 wangzheng man b.txt 100 90 80 200 80 70 300 60 50 400 70 20 |
需要合併得到結果:
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
- awk多檔案操作方法一:
實現思路:
通過外部命令合併檔案,然後通過排序,然後通過awk進行合併操作。
首先:
1 2 3 4 5 6 7 8 9 |
[chengmo@centos5 shell]$ cat a.txt b.txt | sort -n -k1 |awk '{print}' 100 90 80 100 wang man 200 80 70 200 wangsan woman 300 60 50 300 wangming man 400 70 20 400 wangzheng man |
現在需要把:第一列相同的處理合併到一行,這裡需要用“next”語句。它操作,可以參考awk 多行合併【next 使用介紹】(常見應用4)
繼續:
1 2 3 4 5 |
[chengmo@centos5 shell]$ cat a.txt b.txt | sort -n -k1 |awk 'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}' 100 wang man 90 80 200 wangsan woman 80 70 300 wangming man 60 50 400 wangzheng man 70 20 |
需要把幾行合併,經常用到方法是:NR%num 然後將行值儲存下來,next該行。在輸出時候列印出來。
- awk多檔案操作方法二
實現思路
不借助第3放工具開啟,直接通過awk 開啟多個檔案。然後可以通過:FILENAME獲得當前處理檔名。NR總記錄 FNR當前檔案記錄,以及ARGC傳入引數總數,ARGV是陣列,各個引數值。
看下這些例項:
1 2 3 4 5 6 7 8 9 10 |
[chengmo@centos5 shell]$ awk 'BEGIN{print ARGC,ARGV[0],ARGV[1],ARGV[2]}{print FILENAME,NR,FNR,$0}' a.txt b.txt 3 awk a.txt b.txt a.txt 1 1 100 wang man a.txt 2 2 200 wangsan woman a.txt 3 3 300 wangming man a.txt 4 4 400 wangzheng man b.txt 5 1 100 90 80 b.txt 6 2 200 80 70 b.txt 7 3 300 60 50 b.txt 8 4 400 70 20 |
程式程式碼:
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 |
[chengmo@centos5 shell]$ awk ' BEGIN{ if(ARGC<3) { exit 1; } file=""; } { aData[FILENAME,$1]=ARGV[1]==FILENAME?$0:$2"\t"$3; } END{ for(k in aData) { split(k,idx,SUBSEP); if(idx[1]==ARGV[1] && (ARGV[2],idx[2]) in aData) { print aData[ARGV[1],idx[2]],aData[ARGV[2],idx[2]] | "sort -n -k1"; } } }' a.txt b.txt 100 wang man 90 80 200 wangsan woman 80 70 300 wangming man 60 50 400 wangzheng man 70 20 |
程式碼說明:
這裡用到2維陣列,aData[檔名,關聯列對應值] ,這種方法可以將多個檔案內容。放入一個統一二維陣列。然後迴圈陣列,通過if((i,j} in array) 查詢對應列值,在其它檔案中是否存在。
以上是2種實現方法,其中第一種思路較為簡單,很容易理解。第二種處理起來較為複雜。有更好方法大家給我分享。