从配置文件读取模式来替换匹配的出现,但 AWK 混乱且 gsub 无法删除特殊字符和空格

问题描述 投票:0回答:1

我正在尝试替换 list_file1 中存储的许多模式,以匹配 data_file1 字段 2 中的类似数据,然后从 data_file1 中完全替换它。

data_file1 应匹配 list_file1 中存储的大写、小写或大小写模式的组合。

list_file1 中存储的模式将包含前导空格、尾随空格和特殊字符,下面给出一些示例。

列表文件1

AIM TO CONVERT 
 AIM TO CONVERT 
 (FAILED)
( FAILED) 
\REOCCUR

数据文件1

UR4289~Deal,( FAILED) Involved~ON654-L
PR4299~Invoc,(failed)closed~BG657-C
UR4980~ AIM TO CONVERT ,JUL51~NN655-V
UR4659~aim To convert -DISSOLVE~MV694-M

预期产量

UR4289~Deal,Involved~ON654~L
PR4299~Invoc,closed~BG657~C
UR4980~,JUL51~NN655~V
UR4659~-DISSOLVE~MV694~M

awk 脚本已经准备好了

awk -F"~" 'NR==FNR{a[$0];next}{for (i in a) {if (index($2,i)) {gsub(tolower(i),"",$0)} {gsub(toupper(i),"",$0)}} print $0}' list_file1 data_file1 >> new_data1

我在这里缺少什么?

unix awk gsub string-substitution
1个回答
0
投票

您的代码存在几个问题:

index($2,i)
区分大小写,
gsub(tolower(i),"",$0)
替换整行而不是仅字段2...

你可以尝试:

awk -F"~" 'NR == FNR {a[tolower($0)] = length($0); next}
{
  for(i in a) {
    p = index(tolower($2), i)
    if(p) $2 = substr($2, 1, p - 1) substr($2, p + a[i])
  }
  print
}' list_file1 data_file1
© www.soinside.com 2019 - 2024. All rights reserved.