Awk——基于另一个文件编辑两个文件中的字段值';内容

Awk——基于另一个文件编辑两个文件中的字段值';内容,awk,text-processing,Awk,Text Processing,我有三个文件A.txt、B.txt和C.txt。两个文件A.txt和B.txt的行数相同,每个文件中只有一个字段。比如: A.txt B.txt C.txt是一个两列文件,其中每一行由a.txt中的元素组成。比如: 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 C.txt 此awk脚本执行

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

A.txt

B.txt

C.txt是一个两列文件,其中每一行由a.txt中的元素组成。比如:

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

C.txt


此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"
}
该脚本与第一个版本类似,只是做了一些调整。我删除了前面的解释,因为其中一些解释不再适用。无论如何,希望它读得相当清楚

$ 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

如何确定应该替换C中的哪一列?@Tom Fenech:基于A.txt中更改的列。事实上,C.txt的每条记录都包含A.txt中的两个元素。文件C的输入和输出之间的映射不清楚。你能解释得更清楚些吗?@Tom Fenech:如果一行C.txt包含m3、m4和m6的值,我需要替换它们。这是因为在A.txt中,我们分别用C3、C4和G6更改了m3、m4和m6的值。我不熟悉粘贴命令。很方便。谢谢。当不同记录中的字符串长度(文本部分和位数)不同时,您能告诉我如何处理子字符串吗?如果您编辑您的问题以显示数据的样子,我会看一看,只是更新了问题。特别是,我将3改为33,C改为CC,并在文本和数字部分之间加了一个“.”。我已经更新了代码以处理新的数据格式。今后,请尝试在第一时间准确反映您的数据,因为这样可以节省每个人的时间:)
m.1
m.2
CC.33
m.5
CC.4
G.6
m.1 CC.33
m.2 G.6
CC.33 CC.4
m.5 m.7
CC.4 m.823
G.6 m.2
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
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