符号基于匹配字符串替换文件

时间:2014-05-07 09:15:43

标签: regex awk

在这个小组的成员的帮助下,我设法编写了一个简单的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

请提出任何建议。

1 个答案:

答案 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