linux awk 多文件操作2種實現(xiàn)方法

我們經(jīng)常會將2個有關(guān)聯(lián)文本文件進(jìn)行合并處理。分別從不同文件獲取需要的列,然后,整體輸出到一起。awk進(jìn)行多文件處理時候,常常會遇到2個方面問題,第一個是怎么樣合并多個文件為一個文件。第二個問題就是怎么樣將多行合并為一行顯示。我這里說下我的處理2種方法,還有實現(xiàn)思路。
實例文本:
[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
需要合并得到結(jié)果:
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
awk多文件操作方法一:
實現(xiàn)思路:
通過外部命令合并文件,然后通過排序,然后通過awk進(jìn)行合并操作。
首先:
[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
現(xiàn)在需要把:第一列相同的處理合并到一行,這里需要用“next”語句。它操作,可以參考awk 多行合并【next 使用介紹】(常見應(yīng)用4)
繼續(xù):
[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
需要把幾行合并,經(jīng)常用到方法是:NR%num 然后將行值保存下來,next該行。在輸出時候打印出來。
awk多文件操作方法二
實現(xiàn)思路
不借助第3放工具打開,直接通過awk 打開多個文件。然后可以通過:FILENAME獲得當(dāng)前處理文件名。NR總記錄 FNR當(dāng)前文件記錄,以及ARGC傳入?yún)?shù)總數(shù),ARGV是數(shù)組,各個參數(shù)值。
看下這些實例:
[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.txt
100 wang man 90 80
200 wangsan woman 80 70
300 wangming man 60 50
400 wangzheng man 70 20
代碼說明:
這里用到2維數(shù)組,aData[文件名,關(guān)聯(lián)列對應(yīng)值] ,這種方法可以將多個文件內(nèi)容。放入一個統(tǒng)一二維數(shù)組。然后循環(huán)數(shù)組,通過if((i,j} in array) 查找對應(yīng)列值,在其它文件中是否存在。
以上是2種實現(xiàn)方法,其中第一種思路較為簡單,很容易理解。第二種處理起來較為復(fù)雜。有更好方法大家給我分享。
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細(xì)信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運(yùn)維工作中,獲取 CPU 信息是系統(tǒng)運(yùn)維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨(dú)樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機(jī)U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機(jī)u盤,詳細(xì)如下2025-02-17Rsnapshot怎么用? 基于Rsync的強(qiáng)大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠(yuǎn)程文件,接下來詳細(xì)介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進(jìn)2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運(yùn)行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進(jìn),進(jìn)一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細(xì)安裝指南2025-01-16