我有一个 CSV 格式的输入文件。有些字段用双引号引起来,其中有逗号。这是示例行
123,"ABC, DEV 23",345,534.202,NAME
我需要删除 a 的双引号内未出现的所有逗号~
,因此输出应如下所示:
123~"ABC, DEV 23"~345~534.202~NAME
我已经尝试过这个,但它给了我相反的输出:
awk -F '"' -v OFS='' '{ for (i=0; i<= NF; ++i) gsub(",","~",$i) } 1' test.txt
123,ABC~ DEV 23,345,534.202,NAME
答案1
您基本上有一个 CSV 文件,您想要替换其中的分隔符 from,
到~
。
使用csvkit
:
$ csvformat -D '~' file.csv >newfile.csv
$ cat newfile.csv
123~ABC, DEV 23~345~534.202~NAME
cvsformat
删除不需要的引号。到添加引号:
$ csvformat -U 1 -D '~' file.csv
"123"~"ABC, DEV 23"~"345"~"534.202"~"NAME"
请参阅csvformat --help
使用信息。
使用磨坊主(mlr
) 反而:
$ mlr --csv -N --ofs '~' cat file.csv
123~ABC, DEV 23~345~534.202~NAME
保留原始报价,即使不再需要它们:
$ mlr --csv -N --ofs '~' --quote-original cat file.csv
123~"ABC, DEV 23"~345~534.202~NAME
在这两个命令中,该-N
选项用于表示输入没有标头并且输出也不应该有标头这一事实。该--ofs
选项设置输出字段分隔符。
答案2
GNUawk
解决方案:
awk -v FPAT='[^,]+|"[^"]+"' '{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF? "~" : ORS) }' file
FPAT='[^,]+|"[^"]+"'
- 描述每个字段的正则表达式模式是“任何不是逗号的东西”或者“双引号,任何不是双引号的内容,以及结束双引号。”
输出:
123~"ABC, DEV 23"~345~534.202~NAME
答案3
你可以试试这个 awk
awk 'NR%2==1{gsub(",","~")}1' RS='"' ORS='"' infile
答案4
对于上面的例子,我已经通过以下两种方法完成了。已测试
方法1
for (( i=1;i<6;i++)); do awk -F "," -v i="$i" '$i ~ /"/{gsub(" ",",",$2);print }' inputfile;done| tail -1| sed 's/,/~/3g'| sed 's/,/~/1'
输出
123~"ABC, DEV 23"~345~534.202~NAME'
方法2
sed "s/,/~/3g" inputfile| sed 's/,/~/1'
输出
123~"ABC, DEV 23"~345~534.202~NAME'