Sed命令用管道分隔值替换逗号分隔值

时间:2016-03-10 12:05:18

标签: shell unix sed gawk

我的CSV文件包含以下格式的记录:

571283,1,"R","01/15/2002","IBMS,SL"

我想将它们转换为以下格式:

571283|1|R|01/15/2002|IBMS,SL

我试过了:

sed -e 's/ //g' -e 's/\"\,\"/\|/g' -e 's/\,\"/\|/g' -e 's/\"$//' test.csv

但我得到的输出是:

571283,1|R|01/15/2002|IBMS,SL

请告知。

4 个答案:

答案 0 :(得分:3)

gnu-awkFPAT一起使用:

awk -v FPAT='"[^"]+"|[^,]+' -v OFS='|' '{for(i=1; i<=NF; i++) gsub(/"/, "", $i)} 1' file

571283|1|R|01/15/2002|IBMS,SL

如果gnu-awk不可用,请使用此perl命令:

perl -pe 's/(?=(([^"]*"){2})*[^"]*$),/|/g; s/"//g' file

571283|1|R|01/15/2002|IBMS,SL

答案 1 :(得分:1)

这有效:

sed -e 's/,/|/' -e 's/\"\,\"/\|/g' -e 's/\,\"/\|/g' -e 's/\"$//' test.csv

结果是:

571283|1|R|01/15/2002|IBMS,SL

你的第一个序列:

-e 's/ //g'
必须更改

-e 's/,/|/'

展开以回复您的评论。

首先,您必须注意sed是顺序的这一事实,因此转换的顺序很重要。

在你的字符串中:

Market Basket - WF Note A-2,RECM-PS Transfer,09/22/2015,"330930929, 330931800",, 

您想要以不同方式转换相同的字符。因此,g用于全局和转换序列非常重要。

让我们建立序列:

首先让我们摆脱“,,我们想要转变为||:

sed -e 's/\"\,\,/||/' test.csv

会给我们:

Market Basket - WF Note A-2,RECM-PS Transfer,09/22/2015,"330930929, 330931800||

然后我们也这样做,“我们想成为|:

sed -e 's/\"\,\,/||/' -e 's/\,\"/|/' test.csv

给出:

Market Basket - WF Note A-2,RECM-PS Transfer,09/22/2015|330930929, 330931800||

现在我们还有2个逗号要转换为|但不是第三种,简单的方法是重复两次转换:

sed -e 's/\"\,\,/||/' -e 's/\,\"/|/' -e 's/,/|/' -e 's/,/|/' test.csv

市场篮子 - WF Note A-2 | RECM-PS转让| 09/22/2015 | 330930929,330931800 ||

那就是!

提醒:

  1. 考虑你的变换策略序列;
  2. 当时应用一个转换并查看结果,记住它将被送到下一个。
  3. 但最后我认为你需要同时转换BOTH字符串,以便:

    Market Basket - WF Note A-2,RECM-PS Transfer,09/22/2015,"330930929, 330931800",,
    571283,1,"R","01/15/2002","IBMS,SL"
    

    变为:

    Market Basket - WF Note A-2|RECM-PS Transfer|09/22/2015|330930929, 330931800||
    571283|1|R|01/15/2002|IBMS,SL
    

    这是执行此操作的转换序列:

    sed  -e 's/\",\"/|/' -e 's/\"\,\,/||/' -e 's/\,\"/|/' -e 's/,/|/' -e 's/,/|/' -e 's/\"//g' test.csv
    

    此致

答案 2 :(得分:0)

query

答案 3 :(得分:0)

通常,在解析CSV数据时,使用真正的CSV解析器是最简单,最强大的选择

例如,playerModel的CSV解析提供了一个简单的解决方案:

python

作为单行($ python -c 'import csv,sys; reader=csv.reader(sys.stdin) for row in reader: print("|".join(row))' < test.csv 571283|1|R|01/15/2002|IBMS,SL bashksh):

zsh
相关问题