我的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
请告知。
答案 0 :(得分:3)
将gnu-awk
与FPAT
一起使用:
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 ||
那就是!
提醒:
但最后我认为你需要同时转换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
,bash
或ksh
):
zsh