2021-03-03

 

 

如下命令: awk '{...}' a.txt b.txt c.txt 

awk 'NR==FNR{a[$1]=$2"\t"$3"\t"$4"\t"$5"\t"$6}NR>FNR{print $0"\t"a[$1]}' id user

# awk对多文件的处理流程是,依次读取各个文件内容,如上例,先读a.txt,再读b.txt....

那么,在多文件处理的时候,如何判断awk目前读的是哪个文件,而依次做对应的操作呢?

当awk读取的文件只有两个的时候,比较常用的有两种方法:

(1)一种是

awk 'NR==FNR{...}NR>FNR{...}' file1 file2

awk 'NR==FNR{...}NR!=FNR{...}' file1 file2


(2) 另一种是

awk 'NR==FNR{...;next}{...}' file1 file2

了解了FNR和NR这两个awk内置变量的意义就很容易知道这两种方法是如何运作的

FNR The input record number in the current input file. #已读入当前文件的记录数
NR The total number of input records seen so far. #已读入的总记录数
next Stop processing the current input record. The next input record is
read and processing starts over with the first pattern in the AWK
program. If the end of the input data is reached, the END block(s),
if any, are executed.

 

awk 'NR==FNR{...}NR>FNR{...}' file1 file2

# 读入file1的时候,已读入file1的记录数FNR一定等于awk已读入的总记录数NR,因为file1是awk读入的首个文件,故读入file1时执行前一个命令块{...}
# 读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}
 

awk 'NR==FNR{...;next}{...}' file1 file2

# 读入file1时,满足NR==FNR,先执行前一个命令块,但因为其中有next命令,故后一个命令块{...}是不会执行的
# 读入file2时,不满足NR==FNR,前一个命令块{..}不会执行,只执行后一个命令块{...}

 

# 例子 1
########################

现有file1,file2 两个文件。文件file1有2列,内容如:

no1 name1
no2 name2
no3 name2
no4 name3
no5 name4
no6 name4
no7 name4
no8 name5
no9 name6
no10 name6

 

文件file2 有6列,部分有空格,内容如下:

name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18

如果file1的第2列跟file2的第1列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:

命令:awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1

解释:先打印 file2中的所有列数据,再打印 file1中的第一列内容,如果只想打印 file2中的1,2列数据则

awk 'NR==FNR{a[$1]=$1" "$2}NR>FNR{print $1" "a[$2]}' file2 file1

no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值