使用linux shell从CSV文件的列中删除“,”(逗号)值

tcomlyy6  于 2023-08-03  发布在  Linux
关注(0)|答案(4)|浏览(136)

我有一个5列的CSV文件,其中1列是整数值,如(1,564,4,789,9,765)。我需要从col3中删除“,”(逗号),其中整数值应该如下所示:(1564,4789,9865)。
尝试了各种方法使用“awf”和“sed”,但都不起作用。下面是示例输入和预期输出。输入CSV文件:

col1,col2,col3,col4,col5
Abcd,defg,"1,432",hjik,khuj

字符串
输出CSV文件:

col1,col2,col3,col4,col5
Abcd,defg,"1432",hjik,khuj

xuo3flqw

xuo3flqw1#

这个正则表达式可能可以帮助你找到未加引号的字段:

(\d{1,3}(?:,\d{3})+)

字符串
然后用一个简单的替换,如"\1",正确地引用它们。
它查找“1-3个数字,后面跟着一些逗号和三个数字的序列”。
我说might是因为你只展示了一小部分数据,而且这只适用于用逗号分隔的数字。
我从这个破碎的CSV开始:

col1,col2,col3
a,1,b
a,12,b
a,123,b
a,1,234,b
a,12,345,b
a,123,456,b
a,1,234,567,b


得到了这个

| c1 | c2        | c3 |
|----|-----------|----|
| a  | 1         | b  |
| a  | 12        | b  |
| a  | 123       | b  |
| a  | 1,234     | b  |
| a  | 12,345    | b  |
| a  | 123,456   | b  |
| a  | 1,234,567 | b  |


你可以在这里看到它的作用,regexr.com/7ht81
x1c 0d1x的数据
这个小的Python程序将修复我的示例CSV:

import re

lines: list[str] = []
with open("input.csv", encoding="utf-8") as f:
    for line in f:
        fixed = re.sub(r"(\d{1,3}(?:,\d{3})+)", '"\\1"', line)
        lines.append(fixed)

with open("output.csv", "w", encoding="utf-8") as f:
    f.writelines(lines)

6g8kf2rb

6g8kf2rb2#

首先用\r替换你想保留的逗号,然后删除其他逗号。最后恢复逗号。

sed -r 's/([^,]*),([^,]*),(.*),([^,]*),([^,]*)/\1\r\2\r\3\r\4\r\5/;s/,//g;s/\r/,/g' input.csv

字符串
编辑:正如Zach评论的那样,您可能希望将所有\r替换为|||||。在Linux上,您只需要\n字符,但在Windows上通常会生成csv格式。

uqxowvwt

uqxowvwt3#

您应该使用CSV感知工具,如Miller
跑步

mlr --csv put '$col3=gsub($col3,",","")' input.csv >output.csv

字符串
你得到

col1,col2,col3,col4,col5
Abcd,defg,1432,hjik,khuj

  • put是应用函数的动词。
  • gsub是将,替换为col3中的空值的函数
ghhaqwfi

ghhaqwfi4#

使用下面的空格、点或任何东西替换逗号

#!/bin/sh

read filename

#replace all_occurrence(g) of  comma with .
sed 's/,/./g' "$filename" >> output.csv

字符串

相关问题