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中有一列:

A
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

输出结果为:

Method1:########
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

Method2:########
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

Method3:########
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

Method4:########
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

Method5:########
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

Method6:########
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
时间: 2024-10-22 12:24:44

awk打开多个文件的方法的相关文章

asp网络编程:用ASP打开远端MDB文件的方法

如果你用ODBC connection (DSN or DSN-less)来访问远端的(UNC path)数据库, OLEDB会出现以下错误信息: Microsoft OLE DB Provider for ODBC Drivers error ’80004005’ [Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot open the file ’(unknown)’. It is

python—— 文件的打开模式和文件对象方法 & os、os.path 模块中关于文件、目录常用的函数使用方法

引用自"鱼c工作室"     文件的打开模式和文件对象方法  : https://fishc.com.cn/forum.php?mod=viewthread&tid=45279&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403 os.os.path 模块中关于文件.目录常用的函数使用方法: https://fishc.com.cn/forum.php?mod=viewthread&tid=45512&extr

vim-缓存区中打开另外一个文件的方法

现在有这么一种情况:    我现在在ubuntu用户根目录下--    我根目录下有一个文件夹blogs,这个文件夹下面有两个文件:text1,text2.    我现在从-目录下进行如下操作    vim ~/blogs/text1    然后,我想在已经打开的text1中,使用命令行打开同目录下的text2,那么问题来了,你打算怎么打开呢?    我之前的做法就是,使用命令行,然后用e命令.之后使用../../blogs/text2这样来打开.如果目录层级比较少还好(就像这个例子),那么, 

打开大文件的方法

打开大文件的方法: ** Linux* 传统方式: less, cat, tail, grep, sed, awk * 其他方式:1, Vim 的 LargeFile 插件耗物理内存,会一下子把整个文件都加载进内存. 2, glogg 日志资源管理器较快,花了大约 12 秒就打开了一个 1G 的日志文件.更轻量级,在加载完一个 1G 的日志文件后,它仅仅只使用了 83M 的物理内存. 在 Debian (Wheezy 版本或更高版本).Ubuntu 或 Linux Mint 系统中安装 glog

ubuntu 中用vim打开txt等文件中文显示乱码的解决方法  

今晚用ubuntu 12.04 的vim编辑网页代码时,发现上面的中文显示乱码.这个html文件是我之前用gedit编辑的,在gedit里面显示正常,可是在vim下显示就是乱码了. 怎么解决ubuntu中vim显示中文乱码的问题呢? 首先,添加中文字符编码: sudo gedit /var/lib/locales/supported.d/local 在打开的文件中添加下面的中文字符集 zh_CN.GBK GBK zh_CN.GB2312 GB2312 zh_CN.GB18030 GB18030

文件打开的模式和文件对象方法

文件打开模式 打开模式       执行操作 'r'             以只读方式打开文件(默认) 'w'            以写入的方式打开文件,会覆盖已存在的文件 'x'             如果文件已经存在,使用此模式打开将引发异常 'a'             以写入模式打开,如果文件存在,则在末尾追加写入 'b'             以二进制模式打开文件 't'              以文本模式打开(默认) '+'             可读写模式(可添加到其

Windows下VIM使用Vundle,报“E303,无法打开**的交换文件,恢复将不可能”的解决方法

Windows下VIM使用Vundle,报"E303,无法打开**的交换文件,恢复将不可能"的解决方法. Windows下VIM使用Vundle,报"E303,无法打开**的交换文件,恢复将不可能",如下图: 原因:安装Git时没有加入到环境变量中,不能使用临时文件 解决方法: 将 C:\Program Files\Git\cmd 加入到Path环境变量中即可.

Mac系统打开应用程序文件夹的方法+解决Android studio出现fetching android sdk component超时打不开的问题

Mac系统打开应用程序文件夹的方法 我们知道Mac系统文件系统不同于Windows,在Windows下的应用程序安装程序师以.exe为后缀,而mac系统则是以.dmg为后缀.从App Store下载下来的应用程序,双击dmg文件就会出现以下类似这种情形,这里笔者安装的是Android Studio: 把Android Studio拖动到Applications中即可完成安装. 跟Windows不一样,我们没有类似C盘专门存放系统应用程序的文件,有时候我们想去看看应用程序的安装文件,这时我们在Fi

android intent打开各种文件的方法

android intent打开各种文件的方法 1./**  * 检测是否安装了某个软件  *   * @param pkgName "com.bill99.kuaishua"  * @param mContext  * @return  */ public static boolean isPkgInstalled(String pkgName, Activity mContext) {  PackageInfo packageInfo = null;  try {   packag