使用 awk 和 gsub 用字符串替换 CSV 的列

焙烤食品

我有一个输入 csv 文件,看起来像:

Name,Index,Location,ID,Message
Alexis,10,Punggol,4090b43,Production 4090b43
Scott,20,Bedok,bfb34d3,Prevent
Ronald,30,one-north,86defac,Difference 86defac
Cindy,40,Punggol,40d0ced,Central
Eric,50,one-north,aeff08d,Military aeff08d
David,60,Bedok,5d1152d,Study

我想用写一个bash shell脚本awkgsub更换6-7字母数字字符的长字符串用“XXXXX”的ID列下,在一个单独的.csv文件输出。

现在我有:

#!/bin/bash
awk -F ',' -v OFS=',' '{gsub(/^([a-zA-Z0-9]){6,7}/g, "xxxxx", $4);}1' input.csv > output.csv

但是我从跑步bash myscript.sh input.csv得到的输出没有任何意义。output.csv 文件如下所示:

Name,Index,Location,ID,Message
Alexis,10,Punggol,4xxxxx9xxxxxb43,Production 4090b43
Scott,20,Bedok,bfb34d3,Prevent
Ronald,30,one-north,86defac,Difference 86defac
Cindy,40,Punggol,4xxxxxdxxxxxced,Central
Eric,50,one-north,aeffxxxxx8d,Military aeff08d
David,60,Bedok,5d1152d,Study

但预期的输出 csv 应该如下所示:

Name,Index,Location,ID,Message
Alexis,10,Punggol,xxxxx,Production 4090b43
Scott,20,Bedok,xxxxx,Prevent
Ronald,30,one-north,xxxxx,Difference 86defac
Cindy,40,Punggol,xxxxx,Central
Eric,50,one-north,xxxxx,Military aeff08d
David,60,Bedok,xxxxx,Study
拉文德辛格13

使用您显示的示例,请尝试以下代码:

awk -F ',[[:space:]]+'  -v OFS=',\t' '
{
  sub(/^([a-zA-Z0-9]){6,7}$/, "xxxxx", $4)
  $1=$1
}
1
' Input_file | column -t -s $'\t'

说明:将字段分隔符设置为逗号、空格,然后在此处将输出字段分隔符设置为逗号制表符。然后将xxxxx第 4 个字段中的字母数字从开始到结束(6 到 7 次出现)替换最后打印当前行。然后将awk程序的输出发送column命令,使其按照所示的 OP 示例进行。

编辑:如果您的 Input_file,现在按已编辑的样本分隔,请尝试以下操作。

awk -F ',' -v OFS=',' '
{
  sub(/^([a-zA-Z0-9]){6,7}$/, "xxxxx", $4)
}
1
' Input_file

注意:OP 已经从旧版本安装了最新版本的 awk,这些代码有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章