用awk gsub替换CSV文件一列中的字符

Replace character in one column of CSV file with awk gsub

我想使用 awk 将 CSV 文件转换为仅包含原始列子集的新 CSV 文件。而且我还想仅用其中一列的下划线替换空格。我试过这样:

gawk -F "," '
{
  name=gsub(/ /,"_",);
  label=;
  print ","name","label","
}' ./in.csv >> ./out.csv

但是 gsub() returns 匹配出现的次数,而不是替换字符串。所以我得到这样的东西:

,1,label

而不是:

,name_nospace,label

如何像这样使用 awk gsub 只替换一列的字符?

不要:

name=gsub()

as gsub returns 替换次数,不是字符串。刚刚

gsub()

并打印出你摆弄过的字段,即:

gsub(/ /,"_",);
label=;
print ","  "," label "," # or whatever you were doing
gawk -F "," '
{
  gsub(/ /,"_",);
  # print only: ,NameValue,LabelValue,   as output
  # so 4 field with first and last empty as in OP
  print ","  ","  ","
}' ./in.csv >> ./out.csv

在这种情况下,sed 也可用

sed -e ':under' -e 's/^\([^[ ,]*\) /_/;t under' -e 's/^\([^,]*,[^,]*,\).*/,/' ./in.csv >> ./out.csv

要修改"name",更改:

name=gsub(/ /,"_",)

至(仅限 gawk 和较新的 mawk):

name=gensub(/ /,"_","g",)

或(任何 awk):

name=
gsub(/ /,"_",name)

您还应该设置 OFS 而不是硬编码逗号,尤其是在您修改字段时,因此您的脚本应该写成:

awk '
BEGIN { FS=OFS="," }
{
  name=
  gsub(/ /,"_",name)
  label=
  print "", name, label, ""
}' ./in.csv

假设有一些原因需要使用变量而不是直接修改字段。