2

我一直在寻找一种方法来解决我的问题,但已经放弃了。我对脚本很陌生,所以请多多包涵。这就是我想要做的:

我有一个包含 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 中的 ID 匹配的 ID,col=ID,但顺序是随机的。

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

另一个棘手的问题是,其中一些 ID 完全丢失(在这种情况下,它们需要有一个“x”),而其他时候它们有多个备用 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

我的计划是将这些结果打印到一个文件中,然后从那里开始,但它没有用。这不是最优雅的解决方案,但就像我说的,我对此不是很精通。

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

提前致谢

4

1 回答 1

2

假如说

  • 没有超过 2 个选项的 ID
  • 替代 ID 在“其他”文件的第一列中
  • 当没有匹配项时,您只希望“x”出现在 col7 中,如果只有一个匹配项,则不会出现在 col8 中
  • 您可以命名一个字符 ( DELIM),它是 no<TAB>并且永远不会出现在任何替代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

随时在评论中要求调整或解释,我会相应地更新我的答案。

于 2013-08-30T07:38:41.643 回答