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

用awk gsub替换CSV文件一列中的字符,awk,gsub,Awk,Gsub,我想使用awk将一个CSV文件转换为一个新的CSV文件,该文件只包含原始列的一个子集。我还想为其中一列用下划线替换空格。我试过这样做: gawk -F "," ' { name=gsub(/ /,"_",$1); label=$2; print ","name","label"," }' ./in.csv >> ./out.csv ,1,label 但是gsub()返回匹配发生的次数,而不是替换字符串。所以我得到了这样的结果: gawk -F "," ' { na

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

gawk -F "," '
{
  name=gsub(/ /,"_",$1);
  label=$2;
  print ","name","label","
}' ./in.csv >> ./out.csv
,1,label
但是gsub()返回匹配发生的次数,而不是替换字符串。所以我得到了这样的结果:

gawk -F "," '
{
  name=gsub(/ /,"_",$1);
  label=$2;
  print ","name","label","
}' ./in.csv >> ./out.csv
,1,label
而不是:

,name_nospace,label
如何像这样使用awk gsub来仅替换一列的字符?

不要:

name=gsub()
as
gsub
返回替换数,而不是字符串。只是

gsub()
并打印您处理过的字段,即:

gsub(/ /,"_",$1);
label=$2;
print "," $1 "," label "," # or whatever you were doing
在这种情况下,sed也可用

sed -e ':under' -e 's/^\([^[ ,]*\) /\1_/;t under' -e 's/^\([^,]*,[^,]*,\).*/,\1/' ./in.csv >> ./out.csv
要修改“名称”,请更改:

至(仅限于呆呆和较新的呆呆):

或(任何awk):

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

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

假设使用变量而不是直接修改字段是有原因的。

一些示例数据和预期输出如何?
name=$1
gsub(/ /,"_",name)
awk '
BEGIN { FS=OFS="," }
{
  name=$1
  gsub(/ /,"_",name)
  label=$2
  print "", name, label, ""
}' ./in.csv