Bash awk中的动态正则表达式

Bash awk中的动态正则表达式,bash,awk,Bash,Awk,我有像这样的文本文件 1.txt AA;00000; BB;11111; GG;22222; KK;WW;55555;11111; KK;FF;ZZ;11111; KK;RR;YY;11111; AA;BB; CC;DD;BB;AA; AA;BB;CC;DD; 2.txt AA;00000; BB;11111; GG;22222; KK;WW;55555;11111; KK;FF;ZZ;11111; KK;RR;YY;11111; AA;BB; CC;DD;BB;AA; AA;

我有像这样的文本文件

1.txt

AA;00000;
BB;11111;
GG;22222;
KK;WW;55555;11111;
KK;FF;ZZ;11111;
KK;RR;YY;11111;
AA;BB;
CC;DD;BB;AA;
AA;BB;CC;DD;
2.txt

AA;00000;
BB;11111;
GG;22222;
KK;WW;55555;11111;
KK;FF;ZZ;11111;
KK;RR;YY;11111;
AA;BB;
CC;DD;BB;AA;
AA;BB;CC;DD;
我生成这个3.txt输出

AA;00000;
BB;11111;KK;WW;55555;FF;ZZ;RR;YY
GG;22222;
使用这个.awk脚本(我在Windows中使用cmd)

2.txt

AA;00000;
BB;11111;
GG;22222;
KK;WW;55555;11111;
KK;FF;ZZ;11111;
KK;RR;YY;11111;
AA;BB;
CC;DD;BB;AA;
AA;BB;CC;DD;
现在用这种方法替换

AA
替换为
d(2)

BB
替换为
http://a.o/f/i.p?t=1

CC
替换为
Link

DD
A_x-y.7z

脚本无法生成3.txt

AA;00000;
BB;11111;
GG;22222;
KK;WW;55555;11111;
KK;FF;ZZ;11111;
KK;RR;YY;11111;
AA;BB;
CC;DD;BB;AA;
AA;BB;CC;DD;
或者,使用替换的文本无法生成此3.txt文本输出

   d(2);http://a.o/f/i.p?t=1;Link;A_x-y.7z;
您可以看到,从3.txt输出中删除了重复字段,如
AA
BB
,因为脚本就是这样工作的

我怀疑这与
(…)
match()
中作为正则表达式分组有关,因为第一个参数是正则表达式,通过传递
$0
和o,这两个参数在
awk
中都将被视为“动态正则表达式*”

$ cat tst.awk
BEGIN { FS=OFS=";" }
{ key = $(NF-1) }
NR == FNR {
    for (i=1; i<(NF-1); i++) {
        if ( !seen[key,$i]++ ) {
            map[key] = (key in map ? map[key] OFS : "") $i
        }
    }
    next
}
{ print $0 map[key] }

上面的方法只是在数组索引的哈希查找中使用文字字符串,因此它不关心输入中包含的字符。如果您希望将输入视为文字字符串,则不要在其上使用regexp函数或运算符(例如,
match()
~
sub()
),只需使用字符串函数/运算符即可(例如,
index()
==
substr()
中的
).

您的脚本有几个问题。忽略
匹配问题,如果在
2.txt
中有一个字段读取
11
111
1111
…而不是使用
match
使用
index
,则会出现误报。后者是基于字符串的,而不是正则表达式基于会话。并尝试在字符串中搜索
;“arr[i];”
;“$0”;“
while(getline tmp
如果getline失败,将进入一个无限循环。请参阅。从1.txt和2.txt中获取3.txt的方式一点也不明显。我可以看到第二行中的值来自何处,但无法想象为什么它们是按顺序排列的。这也不是我在这两个输入文件上运行脚本时得到的输出(我把
BB;11111;KK;WW;55555;FF;ZZ;RR;YY
作为中间线)。请回答您的问题,以澄清如何将您的输入映射到输出,并确保您发布的输出是正确的,因为您发布了示例输入。@EdMorton是的,您是对的!您的订单是正确的,我错了。现在,我编辑如果您希望我们使用某些特定的输入/输出进行测试,请将其包含在问题中,不要包含一些其他内容(
AA;BB;
CC;DD;BB;AA;
)以及如何转换的说明(
AA替换为d(2)
,等等)您真正希望我们使用的内容。它不适用于我的第二个示例。1.txt有
AA;BB;
2.txt有
CC;DD;BB;AA;
-如果您测试您的脚本,您不能返回
AA;BB;DD;
,因为您返回
AA;BB;
好的,请编辑您的问题以澄清您正在尝试做什么以及您遇到了什么问题我会问另一个问题,因为我认为你是误解。我接受你的替代代码