【问题标题】:Comparison of two files with awk command用awk命令比较两个文件
【发布时间】:2013-05-22 05:57:19
【问题描述】:

我有两个文件,比如file1file2,要进行比较并将其放入file3

file1:

red
green
blue
red
yellow
pink
orange

file2:

domain1,red,-
domain2,-,green
domain3,blue,-
domain4,yellow,pink
domain5,grey,orange

现在我需要在file3中输出如下:

domain1,red
domain2,green
domain3,blue
domain1,red
domain4,yellow
domain4,pink
domain5,orange

对于file1中的每条记录,如果匹配,则需要生成$1作为必填项,并且匹配值是file2中的$2$3,如果两者($2,$3)都匹配,那么它应该在两条记录中(单条记录也可以)作为“domain5,pink,orange”。

我是 awk 命令的新手。请通过awk 帮助我实现这一目标!

我有这个简单的命令并不能满足我的条件

awk 'NR==FNR{x[$1];next}($2,$3) in x' FS=',' file1 file2 >file3

【问题讨论】:

  • 请解释为什么输出中有两个domain1,red?错别字?
  • 因为我在 file1 中有两次红色,红色的搜索模式发生了两次。
  • 呃..我现在看到了..我的回答隐式删除了重复项,不正确...删除..
  • 嗨肯特,你的回答 wud 就满足了我的要求,因为事实上我需要删除重复项。但是有一个小问题,如果我需要在不区分大小写的情况下实现相同的功能怎么办!!相同的命令就足够了吗?问候

标签: unix awk


【解决方案1】:
awk -F, 'BEGIN{OFS=","} 
         NF>1 {s[$2]=s[$3]=$1;} 
         NF==1 {print s[$1],$1}' input2 input1

输出

domain1,red
domain2,green
domain3,blue
domain1,red
domain4,yellow
domain4,pink
domain5,orange

【讨论】:

  • 嗨,上面的 awk 命令只给出了上面提到的 OP 中的第二列,这是必需的。
  • 不错的解决方案@perreal ...如果您不介意请解释一下这个语法 - s[$2]=s[$3]=$1;?
  • 感谢您的回复 Perreal,我得到了 OP,红色,绿色,蓝色,红色,黄色,粉色,橙色......都在不同的行中。它不包括 file2 (domain1 ......) 中的 $1 值
  • @user2407164,第一个参数应该是第二个文件,而不是第一个文件。
  • @Jaypal,谢谢,它同时将s[$2]s[$3] 设置为$1。例如,s['yellow']=s['pink']='domain4'
猜你喜欢
  • 2018-03-04
  • 2019-12-21
  • 2017-01-31
  • 2017-07-25
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多