用awk gsub替换CSV文件一列中的字符
我想使用awk将一个CSV文件转换为一个新的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
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()
asgsub
返回替换数,而不是字符串。只是
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