awk打开多个文件的方法

1、当awk读取的文件只有两个的时候,比较常用的有三种方法
(1)awk 'NR==FNR{...}NR>FNR{...}' file1 file2

(2)awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
(3)awk 'NR==FNR{...;next}{...}' file1 file2

next表示下一个命令不被执行

2、当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 ...

举例说明,这个例子在面试的时候问过。

a.txt中有一列:


B
C
D
E
b.txt中有两列:

A hello world
A good morning
B what
C sad 
D interview someone
D feeling bad
E not so good
E want to be happy
F fail to pass the exam
G good result
则打印出b.txt中的行,满足b.txt中第一列等于a.txt的第一列。


#! /usr/bin/ksh

print "Method1:########"
awk 'ARGIND==1{test[NR]=$1}
    ARGIND==2{for(i in test){if(test[i]==$1){print $0}}}' a.txt b.txt

print "\nMethod2:########"
#the '{" must at the same line of the NR!=FNR
gawk 'NR==FNR{test[NR]=$1}
    NR!=FNR{ 
        for( i in test)
        {
            if(test[i]==$1)
                print $0
        }
           }' a.txt b.txt

print "\nMethod3:########"
gawk 'NR==FNR{test[NR]=$1}
        NR>FNR{ 
                for( i in test)
                {
                        if(test[i]==$1)
                                print $0
                }
        }' a.txt b.txt

print "\nMethod4:########"
gawk 'NR==FNR{test[NR]=$1;next}
        {
                for( i in test)
                {
                        if(test[i]==$1)
                                print $0
                }
        }' a.txt b.txt

print "\nMethod5:########"
gawk 'FILENAME==ARGV[1]{test[NR]=$1}
        FILENAME==ARGV[2]{
                for( i in test)
                {
                        if(test[i]==$1)
                                print $0
                }
        }' a.txt b.txt

print "\nMethod6:########"
gawk 'FILENAME=="a.txt"{test[NR]=$1}
        FILENAME=="b.txt"{
                for( i in test)
                {
                        if(test[i]==$1)
                                print $0
                }
        }' a.txt b.txt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值