用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
假设有一些原因需要使用变量而不是直接修改字段。
我想使用 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
假设有一些原因需要使用变量而不是直接修改字段。