2017-01-05 40 views
2

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

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

但gsub()返回匹配的次数,而不是替换字符串。所以我得到的是这样的:的

,1,label 

代替:

,name_nospace,label 

如何使用AWK GSUB这样的替换字符只有一个列?

+0

一些示例数据和预期输出如何? –

回答

4

别:换人的数量,而不是字符串

name=gsub() 

gsub回报。只是

gsub() 

和打印你拨弄领域,即:在这种情况下,一个sed

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

也可

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

要修改 “名”,变:

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

到(呆子,只有较新的mawk):

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

或(任何AWK):

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

你也应该设置而不是硬编码的逗号OFS,特别是如果你修改字段,因此你的脚本应该写成:

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

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