awk 处理多个文件

转自:http://hi.baidu.com/beibeiboo/item/c0cb1856ba4344474eff20ab


########################
#   关于awk的多文件处理
########################

awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件。

如:
1. shell的Pathname Expansion方式:

awk '{...}'  *.txt
#  *.txt先被shell解释,替换成当前目录下的所有*.txt,
#  如当前目录有1.txt和2.txt,则命令最终为awk '{...}' 1.txt 2.txt

2. 直接指定多个文件: 

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


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

########################
#     处理 2 个文件
########################

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

(1) 一种是
awk 'NR==FNR{...}NR>FNR{...}'  file1 file2

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

(2) 另一种是 awk 'NR==FNR{...;next}{...}' file1 file2

当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,前一个命令块{..}不会执行,只执行后一个命令块{...}

########################
#     处理 多个 文件
########################

当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来,所以就要用到更通用的方法了:

1. ARGIND        # 当前被处理参数标志

awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...复制代码

2. ARGV            # 命令行参数数组

awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...复制代码

3. 把文件名直接加入判断

awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...复制代码


########################
#        例子 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列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:

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

程序:

awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1复制代码


########################
#        例子 2
########################

file1:

sina.com 52.5
sohu.com 42.5
baidu.com 35

file 2:

www.news.sina.com sina.com 80
www.over.sohu.com baidu.com 20
www.fa.baidu.com sohu.com 50
www.open.sina.com sina.com 60
www.sport.sohu.com sohu.com 70
www.xxx.sohu.com sohu.com 30
www.abc.sina.com sina.com 10
www.fa.baidu.com baidu.com 50
www.open.sina.com sina.com 60
www.over.sohu.com sohu.com 20

合并的结果:

www.news.sina.com sina.com 80 52.5
www.over.sohu.com baidu.com 20 42.5
www.fa.baidu.com sohu.com 50 35
www.open.sina.com sina.com 60 52.5
www.sport.sohu.com sohu.com 70 42.5
www.xxx.sohu.com sohu.com 30 42.5
www.abc.sina.com sina.com 10 52.5
www.fa.baidu.com baidu.com 50 35
www.open.sina.com sina.com 60 52.5
www.over.sohu.com sohu.com 20 42.5

程序:

awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在awk中,可以使用逻辑运算符来实现多个条件的组合。 例如,如果要同时满足a>1和b<5两个条件,可以使用"&&"逻辑运算符连接两个条件,表示“与”的关系: ``` awk '{if (a>1 && b<5) {print "条件满足"}}' ``` 如果要满足a>1或者b<5的条件,可以使用"||"逻辑运算符连接两个条件,表示“或”的关系: ``` awk '{if (a>1 || b<5) {print "条件满足"}}' ``` 在awk中还支持其他逻辑运算符,例如"!"表示“非”的关系,可以用于取反条件: ``` awk '{if (!(a>1)) {print "条件不满足"}}' ``` ### 回答2: awk是一种文本处理工具,可以使用if语句来处理多个条件。在awk中,if语句的语法如下: ```awk if (条件1) { 做某事 } else if (条件2) { 做另一件事 } else { 否则做其他事情 } ``` 例如,假设我们有一个包含学生成绩的文本文件,每行包含学生姓名和对应的分数。我们可以使用awk来根据分数判断学生的等级。假设90分及以上为A级,80分及以上为B级,70分及以上为C级,其他为D级。下面是一个简单的示例代码: ```awk awk '{ if ($2 >= 90) { print $1 "的等级是A级" } else if ($2 >= 80) { print $1 "的等级是B级" } else if ($2 >= 70) { print $1 "的等级是C级" } else { print $1 "的等级是D级" } }' 文件名 ``` 代码中,`$2`表示第二列,即分数列。根据分数的不同,输出不同的等级信息。 通过使用if语句和多个条件,我们可以根据需要进行各种复杂的文本处理操作。需要注意的是,awk对于if语句的条件判断是基于某列的值进行的,可以根据需要修改条件的列号。 ### 回答3: awk是一种文本处理和数据提取工具,可以通过使用if和多个条件来进行更复杂的数据处理。 在awk中,可以使用if语句来根据不同的条件执行不同的操作。if语句的语法如下: ``` if (condition) { action } ``` 其中,condition是一个布尔表达式,根据其结果是true还是false来决定是否执行action。在if语句中,可以使用多个条件,使用逻辑运算符来组合条件。 例如,假设我有一个包含学生成绩的文件,我想找出数学成绩大于80且语文成绩大于90的学生。可以使用awk的if语句来实现: ``` awk '{if ($2>80 && $3>90) print $1}' grades.txt ``` 在上述命令中,$2表示第二个字段(数学成绩),$3表示第三个字段(语文成绩)。如果数学成绩大于80且语文成绩大于90,则打印出第一个字段(学生姓名)。 总结起来,awk可以使用if和多个条件来实现更复杂的数据处理,对于需要根据不同条件执行不同操作的情况非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值