`

AWK处理两个文件公共字段

 
阅读更多

在文件score.txt中存有如下数据:(姓名 分数)

lisi 88

bokeyuan 97

zhangsan 77

wangwu 89

hongliu 92

zhanghua 97

在文件student.txt中存有:

zhangsan

hongliu

 

使用awk, cut, grep, find等任意shell脚本,输出student.txt所有学生的分数,即输出:

zhangsan 77

hongliu 92

 

如果只在score.txt中处理,可以很容易得写出

awk ' { if ($1 == "zhangsan") print $0} ' score.txt

但是结合另外一个文件,该怎么处理呢?

 

求人不如求自己,到处找了找处理方法,可以使用awk来处理多个文件,答案如下:

 awk  ' {if (ARGIND==1) grade[$1] = $0}  {if (ARGIND>1 && ($1 in grade)) print grade[$1]} ' score.txt student.txt

简化版得写法为:

 awk 'ARGIND==1 {grade[$1]=$0}  ARGIND>1 && ($1 in grade) {print grade[$1]}' grade.txt student.txt

分析:

ARGIND==1处理第一个参数,即score.txt文件,或者用NR==FNR(

NR:表示awk开始执行程序后所读取的数据行数。

FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。

NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。

)

{grade[$1] = $0} 以grade.txt文件中的第一列为索引,将grade.txt中得内容存入grade数组中

if (ARGIND>1 && ($1 in grade)) print grade[$1] 如果处理的是第二个及以后的文件,即name.txt,检查第一列(姓名)是否在grade数组中,如果在,就打印以姓名为索引的grade信息。

分享到:
评论

相关推荐

    Linux文本处理命令合集

    - **diff** 命令用于比较两个文件之间的不同之处。 - `diff version1.txt version2.txt`:简单地列出两个文件之间的不同行。 - `diff -u version1.txt version2.txt > version.patch`:输出更为详细的差异信息,并...

    HP-UX 11i培训文档 (绝密)

    - **diff**:显示两个文件之间的不同之处。 - **comm**:比较两个已排序文件的公共行和不同行。 - **dircmp**:比较两个目录的内容差异。 - **cut**:从每个输入行中提取字段。 - **paste**:将多个文件的行合并到...

    linxu命令大全 Linux命令非常丰富,下面列出了一些常用的Linux命令,并按照功能进行了分类

    7. **join**:将两个文件按公共字段连接。 - 示例:`join -1 1 -2 1 file1.txt file2.txt` 按第一列连接。 8. **paste**:将多个文件中的行合并在一起。 - 示例:`paste file1.txt file2.txt` 合并文件。 #### ...

    Linux命令术语全称

    - **用途**:查找两个文件之间的公共行。 32. **cp=CoPy** - **含义**:复制文件或目录。 - **用途**:将文件从一个位置复制到另一个位置。 33. **cpio=CoPy In and Out** - **含义**:存档工具。 - **用途**...

    常用linux命令及服务器配置大全 工作中收集的linux常用命令。

    **用途**:`cmp` 命令用于比较两个文件的内容是否相同。 **示例**: ```bash cmp file1 file2 ``` --- #### 二十、col:格式化输入以便打印 **用途**:`col` 命令用于格式化输入,使得它更适合打印。 **示例**...

    LINUX 与 UNIX SHELL编程指南

    - **join**: 根据匹配字段合并两个文件。 - **cut**: 移除文本文件的某部分。 - **paste**: 将两个或多个文件合并。 - **split**: 将文件分割成不同的文件。 ### tr 用法 - **tr**: 用于替换或删除字符。 ### 登录...

    linuxrefcard.pdf

    5. **join**:基于共同字段合并两个文件的行。适用于数据库操作。 6. **split**:将文件分割成多个较小的文件。`split [filename] [prefix]`,用于处理超大文件。 7. **csplit**:根据上下文行分割文件。适合于按...

    Complete Linux Command Reference

    - `join`:根据公共字段合并两个文件。 - `split`:将大文件分割成较小的文件。 6. **脚本编写与自动化** - `bash`:Bourne Again Shell,一种广泛使用的shell。 - `cron`:用于计划在后台定期运行命令。 - `...

    Linux术语全称文本下载

    38. **cmp (compare)**:比较两个文件的差异。 39. **cobra (Common Object Request Broker Architecture)**:一种分布式计算架构。 40. **comm (common)**:比较两个已排序文件,并输出公共行。 41. **cp (CoPy)**...

    linux常用命令大全(80条)

    - **用途**:显示文件内容或合并多个文件。 - **示例**:`cat file.txt` #### 11. **more - 分页显示文件内容** - **用途**:分页查看大文件内容。 - **示例**:`more largefile.txt` #### 12. **less - 类似...

    TextUtils-开源

    8. **join**:连接两个已排序的文件,基于它们的公共字段。这对于合并来自多个来源的数据非常有用。 9. **wc**:计算文件中的单词数、行数和字符数。`wc -l file.txt`会显示`file.txt`的行数。 10. **split**:将...

    tsv-utils:eBay的TSV实用程序:用于大型表格数据文件的命令行工具。 过滤,统计,抽样,联接等

    数据联接是数据分析中的重要操作,tsv-utils支持将两个或多个TSV文件基于公共列进行联接,可以是内连接、左连接、右连接或全连接。这使得用户能够合并来自不同来源的相关数据,从而进行更深入的分析。 ### 5. **...

    Shell脚本获取本地网卡IP、mac地址、子网掩码、dns IP、外网IP

    第一次`awk`用于找到正确的行,第二次`awk`用于分割冒号分隔的字段并获取第二个IP地址。 - `MASK`变量通过查找`Mask`相关的行,并提取第四字段来获取子网掩码。 - `ext_ip`变量利用`curl ifconfig.me`命令来获取当前...

Global site tag (gtag.js) - Google Analytics