我一直在寻找解决问题的方法,但已经放弃了。我是脚本新手,所以请耐心等待。这就是我想要做的事情:
我有一个包含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
我的计划是将这些结果打印到文件中,然后从那里开始,但它不起作用。它不是最优雅的解决方案,但就像我说的那样,我对此并不十分熟练。
你们的任何帮助将不胜感激。如果您需要其他示例或我要澄清事情,请告诉我。
提前致谢
答案 0 :(得分:2)
假设
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
随意在评论中提出调整或解释,我会相应地更新我的答案。