Awk - 根据另一个文件的内容编辑两个文件中的字段值

时间:2014-08-26 16:52:26

标签: awk text-processing

我有三个文件A.txt,B.txt和C.txt。两个文件A.txt和B.txt具有相同的行数,每个文件只有一个字段。像:

A.TXT

m.1
m.2
m.33
m.5
m.4
m.6

B.txt

A
B
CC
D
CC
G

和C.txt是一个两列文件,其中每一行都包含来自A.txt的元素。 Somethong喜欢:

C.txt

m.1 m.33
m.2 m.6
m.33 m.4
m.5 m.7
m.4 m.823
m.6 m.2

我需要做的是首先检查B.txt的行,如果一行有" G"或" CC",替换A.txt中的相应行以及C.txt中的相应变量。像:

A.TXT

m.1
m.2
CC.33
m.5
CC.4
G.6

C.txt

m.1 CC.33
m.2 G.6
CC.33 CC.4
m.5 m.7
CC.4 m.823
G.6 m.2

1 个答案:

答案 0 :(得分:1)

这个awk脚本做你想要的:

BEGIN { FS="[[:space:].]+" }

NR == FNR {    
    if ($3 ~ /CC|G/) { $0 = $3 "." $2; swap[$0]++ }
    else $0 = $1 "." $2
    print > "A_new.txt"
    next
}

{
    for (i=2; i<=NF; i+=2) {
        for (key in swap) {
            split(key, k)            
            if ($i == k[2]) {
                $(i-1) = k[1]
                $i = k[2]
            }            
        }
        $(i/2) = $(i-1) "." $i
    }    
    print $1, $2 > "C_new.txt"
}

像这样运行:

awk -f merge.awk <(paste A.txt B.txt) C.txt

第一个块对第一个输入进行操作。我使用paste来组合A.txt和B.txt,因此输入如下所示:

$ paste A.txt B.txt
m.1     A
m.2     B
m.33    CC
m.5     D
m.4     CC
m.6     G

该脚本类似于第一个版本,只有一些调整。我删除了之前的解释,因为其中一些不再适用。无论如何,希望它读得相当清楚。

$ cat A_new.txt 
m.1
m.2
CC.33
m.5
CC.4
G.6
$ cat C_new.txt 
m.1 CC.33
m.2 G.6
CC.33 CC.4
m.5 m.7
CC.4 m.823
G.6 m.2