【问题标题】:Replace SYMBOL in file with SYMBOL in another file based on matching string根据匹配字符串将文件中的 SYMBOL 替换为另一个文件中的 SYMBOL
【发布时间】:2014-04-26 11:19:39
【问题描述】:

我不是最好的脚本编写者,并且遇到了一个问题,您或许可以指导我。 我有两个文件。

(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 匹配,并将PAIR.txt 中的IDs 替换为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

请有任何建议。

【问题讨论】:

  • 你知道sed 接受多个命令吗?
  • @choroba awk 也是如此 :)

标签: regex awk sed


【解决方案1】:

而不是使用sed 编写sed,这将对'PAIR.txt' 中的每一行执行一个sed 命令,我认为你最好多写一点awk。这是使用数组来保存您的 NAME 和 ID 的一种方法。它使用三元运算用字符串“NA”替换缺失的 ID。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2020-03-25
    • 2020-10-08
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-05-23
    相关资源
    最近更新 更多