使用AWK匹配和替换元素

时间:2014-07-08 04:29:22

标签: regex awk

我有一个直截了当的问题。如果“file”的第一列(ID)中的元素与“subfile”的第一列(ID)的元素匹配,则“file”的匹配元素应该被“subfile”的第二列元素(即符号)替换”。

我可以使用“AWK”匹配“file”和“subfile”中的“ID”,但是在使用相应的“符号”替换匹配的元素时会遇到麻烦。

请提出任何建议。

我为匹配ID而编写的脚本是:

awk 'FNR==NR {a[$1]=$1;next} 1' subfile file

SUBFILE:

"ID"    "Symbol"
"204639_at" "ADA"
"204212_at" "ACOT8"
"209027_at" "ABI1"
"202382_at" "GNPDA1"

FILE

"ID"        "x"  "y"   "z"
"204639_at" 1.22  2.33  4.66
"204212_at" 3.55  5.78  4.78
"209027_at" 4.77  3.21  9.30
"202382_at" 9.66  9.08  1.43 

我需要的输出如下:

         x      y        z

ADA     1.22    2.33    4.66
ACOT8   3.55    5.78    4.78
ABI1    4.77    3.21    9.3
GNPDA1  9.66    9.08    1.43

2 个答案:

答案 0 :(得分:2)

使用join

join -j 1 FILE SUBFILE -o 2.2,1.2,1.3,1.4 | \
    sed 's/Symbol//;s/"//g;s/  */:/g' | column -t -s:

给出:

        x     y     z
ADA     1.22  2.33  4.66
ACOT8   3.55  5.78  4.78
ABI1    4.77  3.21  9.30
GNPDA1  9.66  9.08  1.43

答案 1 :(得分:1)

你可以这样做:

awk 'FNR==NR {a[$1]=$2;next} {$1=a[$1]}1' subfile file
"Symbol" "x" "y" "z"
"ADA" 1.22 2.33 4.66
"ACOT8" 3.55 5.78 4.78
"ABI1" 4.77 3.21 9.30
"GNPDA1" 9.66 9.08 1.43

或某些格式化:

awk 'FNR==NR {a[$1]=$2;next} {$1=a[$1];gsub(/\"/,"");gsub(/Symbol/,"")}1' OFS="\t" subfile file
        x       y       z
ADA     1.22    2.33    4.66
ACOT8   3.55    5.78    4.78
ABI1    4.77    3.21    9.30
GNPDA1  9.66    9.08    1.43