日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

awk 多文件操作2种实现方法

發布時間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 awk 多文件操作2种实现方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們經常會將2個有關聯文本文件進行合并處理。分別從不同文件獲取需要的列,然后,整體輸出到一起。awk進行多文件處理時候,常常會遇到2個方面問題,第一個是怎么樣合并多個文件為一個文件。第二個問題就是怎么樣將多行合并為一行顯示。我這里說下我的處理2種方法,還有實現思路。

?

實例文本:

[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 manb.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進行合并操作。

首先:

[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)

繼續:

[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是數組,各個參數值。

看下這些實例:

[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

程序代碼:

[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.txt100 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種實現方法,其中第一種思路較為簡單,很容易理解。第二種處理起來較為復雜。有更好方法大家給我分享。

轉載于:https://www.cnblogs.com/chengmo/archive/2010/10/15/1851983.html

總結

以上是生活随笔為你收集整理的awk 多文件操作2种实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。