用逗号替换下划线并删除CSV中的双引号


10

我有一个CSV文件

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. 等等。

我需要将此CSV文件转换为

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

Answers:


24

更简单的方法是使用 tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

它的工作方式是使用tr两个参数-要替换的字符集和它们的替换。在这种情况下,我们只有1个字符的集合。我们通过shell运算符重定向input.csv输入tr的stdin流<,并将得到的输出通过管道传递tr -d '"'到删除双引号。

但是awk也可以做到。

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

其工作方式略有不同:awk逐行读取每个文件,每个内联脚本为/Pattern match/{ codeblock}/Another pattern/{code block for this pattern}。这里我们没有模式,因此这意味着为每行执行代码块。gsub()函数用于一行中的全局替换,因此我们使用它来将下划线替换为逗号,并将双引号替换为空字符串(有效删除字符)。的1是代替模式匹配的缺失码块,缺省简单地打印线; 换句话说,代码块可以gsub()完成工作并1打印结果。

使用shell重定向(>)将输出发送到新文件:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

抱歉。我也想删除反逗号。我更新了问题
RKR

@RKR答案已相应更新,Ian的答案也已更新
Sergiy Kolodyazhnyy

13

作为替代方案,您也可以使用以下sed命令:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
在单引号内,您无需转义双引号。
glenn jackman

确实是@glennjackman!我刚刚删除了转义的反斜线
IanC

10

命令行文本处理的“瑞士军队电锯” Perl也可以做到这一点。语法(并非巧合)与trsed示例非常相似:

perl -pe 'tr/_"/,/d' input.csv > result.csv

要么:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

但老实说,如果您不想花时间学习一种新的编程语言(这正是awk,Perl和sed以及其他类似工具之类的东西)仅用于此基本任务,那么您也可以在任何支持搜索和替换的文本编辑器:

  1. 在您喜欢的文本编辑器中打开CSV文件(例如gedit,kate,鼠标垫等;甚至Windows上的普通旧记事本或Wordpad也可以执行此操作)。

  2. 从菜单中选择“搜索并替换”(如果没有单独的“搜索”菜单,通常在“编辑”下找到)。

  3. 输入_搜索框和,替换框。

  4. 点击“全部替换”。

  5. "在搜索框中重复,在替换框中不重复任何操作。

  6. 保存文件。

现在,如果您需要对100个或1000个文件(而不是一个文件)执行此操作,那么开始学习新的命令行工具就很有意义了。而且,当然,一旦您知道如何使用Perl或sed或其他方法,以后您就可以节省大量时间和精力进行类似的任务。但是对于只需要一次性完成的一项工作,您不需要再做一次,有时,诸如文本编辑器之类的基本交互式工具是最简单的解决方案。


3

您也可以这样做vim

打开文件:vim input.csv,然后使用vim的高级搜索工具s。键入冒号(:)进入命令模式,然后运行以下命令:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

与IanC的答案几乎相同的命令,但在vim而不是中使用sed


2

为什么不只更改输入和输出分隔符值的默认值

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.