根据匹配的字符串将SYMBOL中的SYMBOL替换为另一个文件中的SYMBOL

时间:2014-04-26 11:19:40

标签: regex awk sed

我不是最好的脚本编写者,遇到了一个你可以引导我的问题。 我有两个文件。

(1)SYMBOL.txt(第1和第2列代表NAME和ID)

"UBA6"  "A0AVT1"
"NBAS"  "A2RRP1"
"GSAP"  "A4D1B5"
"GRID2IP"   "A4D2P6"
"TRAPPC13"  "A5PLN9"

(2)PAIR.txt(第1和第2列代表ID)

A0AVT1  P62988
P06400  Q14186
Q14186  P28749
Q6NUQ1  A2RRP1
O43264  A2RRP1

我需要将SYMBOL.txtPAIR.txt匹配,并将IDs中的PAIR.txt替换为来自SYMBOL.txt的NAMES。

(1)我编写了一个简单的awk脚本来解决目的,但我 需要将IDS替换为NA完全没有匹配的(实际上我无法做到这一点)。

(2)我将输入文件PAIR.txt修改为输出,但我需要一个单独的输出文件(在这种情况下说LL)。

我写过的剧本:

awk '{print $2 $1}' SYMBOL.txt \
    | sed 's/^/sed/g' \
    | sed 's/\""/\//g' \
    | sed 's/\"/\//g' \
    | sed 's/^sed/sed -i \"s/g' \
    | sed 's/$/g"/g' \
    | sed 's/$/ PAIR.txt/g' \
    | sh >LL

我需要的样本输出:

UBA6 NA
NA NA
NA NA
NA NBAS

任何建议请。

1 个答案:

答案 0 :(得分:4)

而不是使用sed来编写sed,这会为“PAIR.txt”中的每一行执行一个sed命令,我认为你&#39 ;再过一点awk会更好。这是使用数组来保存您的NAME和ID的一种方法。它使用三元运算将缺少的ID换成字符串" NA"。

awk 'FNR==NR {

    gsub(/"/,"");
    a[$2]=$1;

    next
}
{
    for (i=1;i<=NF;i++) {

        $i = ($i in a) ? a[$i] : "NA"
    }
}
1' SYMBOL.txt PAIR.txt

结果,使用您的输入:

UBA6 NA
NA NA
NA NA
NA NBAS
NA NBAS