CSV文件在数据中包含额外的逗号

时间:2018-01-31 08:59:13

标签: csv unix awk sed

我有一个CSV文件,其中包含一些包含逗号的数据。我试图在不考虑其他字段的情况下整体检索数据。

输入示例

 id,name,marks,subject/s
 1, Dileep, Kumar, 78, Maths
 2, Pavan, Joshi, 76, Science, Social
 3, Naveen, 95, English

我可以删除字段中的逗号,因为名称是一列,即使其中有其他逗号

需要输出 -

 id,name,marks,subject/s
 1, Dileep Kumar, 78, Maths
 2, Pavan Joshi, 76, Science Social
 3, Naveen, 95, English

我知道删除主题的逗号没有意义,但这就是我的要求。

请帮帮我

3 个答案:

答案 0 :(得分:0)

如果您的Input_file与显示的示例相同,那么以下内容可能对您有帮助。

awk  '$2~/[a-zA-Z]+/ && $3!~/[a-zA-Z]+/{$2=$2~/,/?$2:$2",";print;next} $2~/[a-zA-Z]+/ && $3~/[a-zA-Z]+/{sub(/,/,"",$2)} 1'  Input_file

或者现在添加非单一衬里形式的溶液。

awk  '
$2~/[a-zA-Z]+/ && $3!~/[a-zA-Z]+/{
  $2=$2~/,/?$2:$2",";
  print;
  next
}
$2~/[a-zA-Z]+/ && $3~/[a-zA-Z]+/{
  sub(/,/,"",$2)
}
1
' Input_file

输出如下。

 id,name,marks,subject/s
1, Dileep Kumar, 78, Maths
2, Pavan Joshi, 76, Science, Social
3, Naveen, 95, English

答案 1 :(得分:0)

echo 'id,name,marks,subject/s
 1, Dileep, Kumar, 78, Maths
 2, Pavan, Joshi, 76, Science, Social
 3, Naveen, 95, English' | sed -r 's/(^\s*[0-9]+,\s*[a-zA-Z]+),(\s*[a-zA-Z])/\1\2/g'
id,name,marks,subject/s
 1, Dileep Kumar, 78, Maths
 2, Pavan Joshi, 76, Science, Social
 3, Naveen, 95, English

答案 2 :(得分:0)

用于patsplit()和gensub()的GNU awk:

$ cat tst.awk
{
    nf = patsplit($0,nums,/ [0-9]+, /,rest)
    $0 = ""
    for (i=0; i<=nf; i++) {
        $0 = $0 nums[i] gensub(/, /," ","g",rest[i])
    }
    print
}
$ awk -f tst.awk file
 id,name,marks,subject/s
 1, Dileep Kumar, 78, Maths
 2, Pavan Joshi, 76, Science Social
 3, Naveen, 95, English