在这个小组的成员的帮助下,我设法编写了一个简单的awk脚本,该脚本匹配" subfile"的第一列。 (已批准的符号)包含"文件"的两列。并使用" NA"替换不匹配的元素;在"文件"。
除了仅匹配第一列之外,我还需要包含"子文件"的两列中的其余列。 (以前的符号和同义词)匹配。
总的来说,我有一个直截了当的问题。如果" file"中的任何元素匹配"子文件"的三列中的任何一个元素,"文件"的匹配元素;应替换为"子文件"的第一列元素(即批准的符号)。
我写过的剧本:
awk 'FNR==NR {a[$1]=$1;next}
{
for (i=1;i<=NF;i++)
{
$i = ($i in a) ? a[$i] : "NA"
}
}
1' subfile file
子文件
Approved Symbol Previous Symbols Synonyms
A1BG
A1CF ACF, ASP, ACF64, ACF65, APOBEC1CF
A2ML1 CPAMD9 FLJ25179
AAAS
AAR2 C20orf4 bA234K24.2
MAP2K4 SERK1 MEK4, JNKK1, PRKMK4, MKK4
FLNC FLN2 ABP-280, ABPL
MYPN MYOP
ACTN2
档案
MAP2K4 FLNC
MYPN ACTN2
EIF2C2 MIRLET7B
EIF2C2 MIRLET7I
请提出任何建议。
答案 0 :(得分:1)
我意识到你正在寻找一个awk解决方案,但你的问题让我感到震惊,因为它可以从python词典的力量中受益。下面是一个执行既定目标的python脚本:将文件中的所有元素与子文件中的条目相匹配,并输出相应的批准的符号 子文件,否则为NA
。
请注意,这是为Python 3.x编写的 - 但对于Python 2.x来说,并不难稍微修改。
# Build dictionary of approved symbols from synonyms
approved_symbols = {}
with open("subfile") as subfile:
subfile.readline() # skip header line
for line in subfile:
columns = line.strip().split() # split into columns on whitespace
approved = columns[0]
for col in columns:
synonyms = col.split(',') # split into elements on comma
# Add each synonym to dictionary
for syn in synonyms:
approved_symbols[syn] = approved
# Process file
with open("file") as file:
for line in file:
for element in line.strip().split():
# If symbol found, print it, otherwise output "NA".
print(approved_symbols.get(element, "NA"), end='\t')
print('')
输出:
MAP2K4 FLNC
MYPN ACTN2
NA NA
NA NA