使用 sed 或 awk 修改特定列

使用 sed 或 awk 修改特定列

我有一个 CSV 文件,如下所示:

qw12er,foo,0 bn5mgh
rt8yp,foo,10 gh78jk
bn852mv,foo,852 78ghjkh
tgbr,foo,10 ujmyhn
wsx2d,foo,0000 ui52ohn
tgbr,foo,7418529 ujmyhn
ikl896o,foo,22 wsxdc52

我想修改第三列并删除第三列开头的所有数字和空格。

那么输出将如下:

qw12er,foo,bn5mgh
rt8yp,foo,gh78jk
bn852mv,foo,78ghjkh
tgbr,foo,ujmyhn
wsx2d,foo,ui52ohn
tgbr,foo,ujmyhn
ikl896o,foo,wsxdc52

答案1

另一种解决方案是awk使用sub

awk -F, 'sub("^[0-9]+\\s","",$3)' OFS=, file 

输出:

qw12er,foo,bn5mgh
rt8yp,foo,gh78jk
bn852mv,foo,78ghjkh
tgbr,foo,ujmyhn
wsx2d,foo,ui52ohn
tgbr,foo,ujmyhn
ikl896o,foo,wsxdc52

解释:

  • -F,:设置逗号作为输入字段分隔符

  • OFS=,:设置逗号作为输出字段分隔符(默认为空格)

  • sub("^[0-9]+\\s","",$3):删除字符串开头的数字和空格$3并打印当前行(因为“打印”是 中的默认操作awk

通过这种方式,您可以编辑所需的列并打印所有其他列(通常可能很多)。

答案2

我用了awk

awk -F"[ ,]" '{print $1","$2","$4 }' yourfile 

结果:

qw12er,foo,bn5mgh
rt8yp,foo,gh78jk
bn852mv,foo,78ghjkh
tgbr,foo,ujmyhn
wsx2d,foo,ui52ohn
tgbr,foo,ujmyhn
ikl896o,foo,wsxdc52

答案3

awk

awk '{FS="[, ]"; OFS=","; print $1, $2, $4}' filename

sed

sed 's/^\(.*,\)[0-9]* \([^,]*\)$/\1\2/' filename

答案4

根据显示的数据,可以是以下情况sed

sed -r 's/,[0-9 ]+ /,/' file.csv

如果数据变化,正则表达式应该更改为更强大

相关内容