AWK/GAWK 在模式匹配后添加字符

AWK/GAWK 在模式匹配后添加字符

我的测试文件中有以下数据结构:

"111","222","AAABBB","333","444","555"

我想转换第三个字段,以便在第三个 [AZ] 之后有一个“-”,如下所示:

"111","222","AAA-BBB","333","444","555"

使用 split() 函数是完成这项工作的最佳工具吗?这是我尝试过的:

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); print seps[1]"/"seps[2]};' test

上面的命令执行了我想要的操作,但是如何打印整行,包括更新的 $3 字段?结果:

AAA-BBB

答案1

短的awk解决方案:

awk 'BEGIN{ OFS=FS="," }{ sub(/[A-Z]{3}/, "&-", $3) }1' file
  • [A-Z]{3}- 匹配 3 个大写字母的正则表达式模式
  • &- 代表正则表达式模式匹配的精确子字符串

输出:

"111","222","AAA-BBB","333","444","555"

答案2

在 中awk,当您重新分配字段变量的值时, 的值$0将重新计算:

$ echo "A B C" | awk '{ $2 = "two"; print $0 }'
A two C

所以在你的情况下:

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); $3 = seps[1]"-"seps[2]; print $0}' test

答案3

您对所需逻辑的描述并非 100% 清晰,但以下 Sed 命令适用于您的示例输入:

sed 's/[A-Z]/&-/3' test-file.txt

相关内容