从一个文件中查询另一个文件的关键字

今天遇到一个比较tricky的问题,问题如下:
假设有两个文件f1,f2,f1中有两列a,b。f2中有多列,但是包含了a和b。现在想要从f2中查找出f1中对应的记录。

先post下我最终的解决方案吧:

cat f1 | while read line; do s=($line); a=${s[0]}; b=${s[1]}; awk -v a=$a -v b=$b '{if ($1==a && $5==b) print $0}' f2;  done

这段代码其实很简单,读出f1,装入数组,用awk来查询。主要走了一些弯路,记录下一些用法和区别:
首先我是想用最简单的办法,for和grep组合来做,大概思路如下:

for line in $(cat f1); do s=($line); a=${s[0]}; b=${s[1]}; grep $a f2 | grep $b;  done

这就有一个问题,我们要实现的目的是读出每一行,把每一行的值赋给数组,但是for直接根据空格来遍历,而不是每一行来遍历,而while就没有这个问题,
刚开始我还想通过set IFS='\n'来强制按行遍历,但是数组赋值这时候又会出问题。
中间我还想通过python来实现,简单实现了下,但是效果不理想。大致代码如下:

f1 = open("f1.txt")
f2 = open("f2.txt")

for line in f2:
  for l in f1:
    content = l.split("\t")
    if content[0] in line and content[1] in line:
      print l
      print line
f1.close()
f2.close()

这个循环有个问题,第二重循环f1遍历的时候,遍历完了就到end了,不会从头再次遍历,有两种办法:
第一,在遍历f1之前加个seek(0)
第二,直接把两个文件全部读入内存,赋值后再遍历就没有问题了。

update: 20180309

用while循环解决方案今天遇到一个坑,用管道符'|'其实是启动一个子进程,所以如果子进程改变父进程的变量,这种方式是不可行的,那如果文件行中有空格又想用for循环,解决办法是cat后再awk下就没问题了,当然对于以上问题,awk是没用的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,698评论 0 13
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 13,454评论 3 53
  • 晚安,宝贝,我曾说有我在你就不会受到伤害 晚安,宝贝,我曾说有我在你就不会再有难过 晚安,宝贝,我曾说有我在你就不...
    尔之语阅读 3,950评论 0 1
  • 为何她们要在最脆弱的年纪里,经受如此折磨摧残,世人的冷酷无情,那些犯罪者以及亲人的无耻自私,法律的懦弱无能。...
    静待等你阅读 1,469评论 0 0
  • 有时候脚本批量执行API会行不通,比如跳不过CAS认证。怎么办?使用Postman! 前景:需要执行一个API:h...
    予早阅读 8,584评论 0 0