搜索和追加

时间:2013-08-30 06:30:24

标签: bash search awk append

我一直在寻找解决问题的方法,但已经放弃了。我是脚本新手,所以请耐心等待。这就是我想要做的事情:

我有一个包含6列的文件(让我们称之为file1)。在第一列有一个ID,在第7列有一个替代ID,但整个列都是空的:

ID col2 col3 col4 col5 col6 AltID AltID2
a   a    x    43   5    54   A1     D3
b   f    4    44   9    51   B3     KL5
c   h    k    90   0    52   K9     JD3
...

我有另一组文件(准确地说是6个),每个文件有8列(它们是制表符分隔文件)。第4列包含与File1,col = ID匹配的ID,但是以随机顺序排列。

我需要做的是从我拥有的其他6个文件的第4列中的File1中搜索第1列的每一行中的每个ID,并且当匹配时,将该匹配放在File1的第7列上

另一个棘手的问题是,其中一些ID完全丢失(在这种情况下,它们需要有一个“x”),有时候它们有多个Alternate ID(在这种情况下,我将它们放在每个ID旁边)另外,在File1的第7列和第8列中

我尝试了一下grep,但后来偶然发现人们说awk实际上更好。我尝试构建一个脚本并想出了这个:

#! /bin/bash

while read fn; do

STR =$(echo -ne "${fn}" ; awk '  { if($4=="${fn}") printf "%s\t", $7} ' ./*.txt)
echo $STR > test.txt

done < dreg.txt

它显然不起作用,我知道代码看起来我不确定我在做什么(我不是),但这是我开始的地方。我本质上是在尝试读取我创建的虚拟文件,只使用带有文本的第一列,然后搜索该目录中所有其他文本文件的每一行。然后,如果找到,我会回显ID的名称,然后是备用ID,希望得到以下格式:

ID AltID AltID2

我的计划是将这些结果打印到文件中,然后从那里开始,但它不起作用。它不是最优雅的解决方案,但就像我说的那样,我对此并不十分熟练。

你们的任何帮助将不胜感激。如果您需要其他示例或我要澄清事情,请告诉我。

提前致谢

1 个答案:

答案 0 :(得分:2)

假设

  • 没有超过2个替代品的ID
  • 替代ID位于“其他”文件的第一列
  • 如果没有匹配,你只希望“x”出现在col7中,如果只有一个匹配则不希望出现在col8中
  • 您可以命名一个不是DELIM的字符(<TAB>)并且永远不会出现在任何 altenative ID中
  • 所有文件都完全 一个标题行

以下解决方案适合我

$ cat file1
ID      col2    col3    col4    col5    col6
a       a       x       43      5       54
b       f       4       44      9       51
c       h       k       90      0       52
$ cat file2a
AltID   col2    col3    ID
A1      some    thing   a
B1      more    stuff   b
$ cat file2b
AltID   col2    col3    ID
A2      even    more    a
D1      random  stuff   d
$ cat test.awk
BEGIN {
   FS = "\t"
   OFS = FS
   DELIM = ";"
   MISSING = "x"
}
FILENAME != "file1" {
   if (FNR != 1) {
      alt[$4] = (alt[$4] ? alt[$4] "" DELIM : "") "" $1
   }
   next
}
FNR == 1 {
   $7 = "AltID"
   $8 = "AltID2"
   print
   next
}
{
   idcount = split(alt[$1], ids, DELIM)
   $7 = (idcount ? ids[1] : MISSING)
}
idcount > 1 {
    $8 = ids[2]
}
1
$ awk -f test.awk file2* file1
ID      col2    col3    col4    col5    col6    AltID   AltID2
a       a       x       43      5       54      A1      A2
b       f       4       44      9       51      B1
c       h       k       90      0       52      x

随意在评论中提出调整或解释,我会相应地更新我的答案。