我的测试文件中有以下数据结构:
"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