首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个文件的第一个字段,如果字段匹配,则输出两个文件的这些字段的整个记录

比较两个文件的第一个字段,如果字段匹配,则输出两个文件的这些字段的整个记录
EN

Stack Overflow用户
提问于 2014-08-07 21:43:24
回答 2查看 117关注 0票数 0

我有两个文件,par1.txt,par2.txt。我想查看两个文件的第一个字段或列,比较它们,然后如果它们匹配,则打印它们匹配的记录或行。

放大文件:

par1.txt

代码语言:javascript
复制
ocean;stuff about an ocean;definitions of oeans
park;stuff about parks;definitions of parks
ham;stuff about ham;definitions of ham

par2.txt

代码语言:javascript
复制
hand,stuff about hands,definitions of hands
bread,stuff about bread,definitions of bread
ocean,different stuff about an ocean,difference definitions of oceans
ham,different stuff about ham,different definitions of ham

至于我的输出,我想要的是

代码语言:javascript
复制
ocean:stuff about an ocean:definitions of oeans
ocean:different stuff about an ocean:difference definitions of oceans
ham:different stuff about ham:different definitions of ham
ham:stuff about ham:definitions of ham

如示例所示,文件中的FS是不同的。输出FS不必是":“,它不可能是一个空格。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-07 22:18:14

编辑的答案

根据您的评论,我相信您有两个以上的文件,这些文件有时有逗号,有时有分号作为分隔符,而且您希望打印出与第一个字段匹配的任何行,只要第一个字段有多个。如果是这样的话,我想你想要这个:

代码语言:javascript
复制
awk -F, '
   {
     gsub(/;/,",");$0=$0;              # Replace ";" with "," and reparse line using new field sep
     sep="";                           # Preset record separator to blank
     if(counts[$1]++) sep="\n";        # Add newline if anything already stored in records[$1]
     records[$1] = records[$1] sep $0; # Append this record to other records with same key
   }
   END { for (x in counts) if (counts[x]>1) print records[x] }' par*.txt

原始答案

我想出了这个:

代码语言:javascript
复制
awk -F';' '
   FNR==NR {x[$1]=$0; next}
   $1 in x {printf "%s\n%s\n",$0,x[$1]}' par1.txt  <(sed 's/,/;/' par2.txt)

par1.txt中读取并存储在由第一个字段索引的数组x[]中。将par2.txt中的逗号替换为分号,以便分隔符匹配。在读取par2.txt的每一行时,查看它是否在存储的数组x[]中,如果是,则打印存储的数组x[]和当前行。

票数 0
EN

Stack Overflow用户

发布于 2014-08-07 22:07:06

使用awk

代码语言:javascript
复制
awk -v OFS=":" '
{ $1 = $1 }
NR==FNR { lines[$1] = $0; next }
($1 in lines) { print lines[$1] RS $0 }
' FS=";" par1.txt FS="," par2.txt

输出:

代码语言:javascript
复制
ocean:stuff about an ocean:definitions of oeans
ocean:different stuff about an ocean:difference definitions of oceans
ham:stuff about ham:definitions of ham
ham:different stuff about ham:different definitions of ham

解释:

  • 将输出字段分隔符设置为:。如果希望分隔空格,则不需要设置-v OFS
  • $1=$1帮助我们重新格式化整行,以便在重新构造时获得OFS的值。
  • NR==FNR将第一个文件读取到数组中。
  • 当我们处理第二个文件时,我们在数组中查找第一列。如果存在,则从数组打印行,从第二个文件打印行。
  • FS=";" par1.txt FS="," par2.txt是一种可以为不同文件指定不同字段分隔符的技术。

如果在两个文件中都有重复的第一列,并且希望捕获所有内容,那么请使用以下内容。这是相似的逻辑,但我们保持所有的线在数组和打印在最后。

代码语言:javascript
复制
awk -v OFS=":" '
  { $1 = $1 }
  NR==FNR {
      lines[$1] = (lines[$1] ? lines[$1] RS $0 : $0);
      next
  }
  ($1 in lines) {
      lines[$1] = lines[$1] RS $0;
      seen[$1]++
  }
  END { for (patt in seen) print lines[patt] }
' FS=";" par1.txt FS="," par2.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25192783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档