部分ID匹配并合并多个到一个

时间:2015-05-18 02:51:22

标签: awk sed match

我有两个文件,File1和File2。 File1有6000行,file2有3000行。我想匹配id并根据匹配合并文件,这很简单。但是,file1和file2中的ID仅部分匹配。看看文件。对于file2中的每个id(行),文件1中必须有两个匹配的id(行)。此外,file2中并不存在file2中的所有id。我曾尝试过awk但没有得到所需的输出。

File1中

1_A01_A
1_A01_B
2_B03_A
2_B03_B
1_A02_A
1_A02_B
2_B04_A
2_B04_B
1_A03_A
1_A03_B
2_B05_A
2_B05_B
1_A04_A
1_A04_B
2_B06_A
2_B06_B
1_A06_A
1_A06_B
2_B07_A
2_B07_B
1_A07_A
1_A07_B
2_B08_A
2_B08_B
9_F10_A
9_F10_B
12_D08_A
12_D08_B
5505744243493_F09.CEL_A_A
5505744243493_F09.CEL_B_B

文件2

1_A01   14
2_B03   13
1_A02   4
2_B04   14
1_A03   11
2_B05   8
1_A04   18
2_B06   15
1_A06   10
2_B07   4
1_A07   8
2_B08   22
1_A08   5
2_B09   15
1_A09   20
2_B10   17

2 个答案:

答案 0 :(得分:0)

awk -F" " 'FNR==NR{a[$1]=$2;next}{for(i in a){if($1~i){print $1" "a[i];next}}}' file1.txt file2.txt

  

FNR == NR将在awk读取文件1时为true而在读取文件2时为false。从{for(i in a} ...开始的代码部分将对文件2执行。$ 1~i寻找与条件类似,然后对于相关匹配,输出将被打印。

     

我错误地使用了不同的文件符号。我的file1.txt包含问题陈述中的file2.txt的内容,反之亦然

     

<强>输出
  1_A01_A | 14
  1_A01_B | 14
  2_B03_A | 13
  2_B03_B | 13
  1_A02_A | 4
  1_A02_B | 4
  2_B04_A | 14
  2_B04_B | 14
  1_A03_A | 11
  1_A03_B | 11
  2_B05_A | 8
  2_B05_B | 8
  1_A04_A | 18
  1_A04_B | 18
  2_B06_A | 15
  2_B06_B | 15
  1_A06_A | 10
  1_A06_B | 10
  2_B07_A | 4
  2_B07_B | 4
  1_A07_A | 8
  1_A07_B | 8
  2_B08_A | 22
  2_B08_B | 22

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -r 's|^(\S+)(\s+\S+)$|s/^\1.*/\&\2/p|' file2 | sed -nf - file1

这会从file2创建一个sed脚本,然后针对file1中的数据运行它。

N.B。任一文件的顺序都不重要,file1只处理一次。