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

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

我有一个 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

答案1

更简单的方法是使用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.csvinputtr的标准输入流<,并将结果输出通过管道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

答案2

作为替代方案,您还可以使用以下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

答案3

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

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

或者:

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

但老实说,如果您不想仅仅为了这个基本任务而花时间学习一门新的编程语言(实际上 awk、Perl 和 sed 以及其他类似工具就是这样),那么您也可以这样做任何支持搜索和替换的文本编辑器:

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

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

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

  4. 单击“全部替换”。

  5. 在搜索框中重复",并且在替换框中没有任何内容。

  6. 保存文件。

现在,如果您需要对 100 个或 1000 个文件而不是一个文件执行此操作,那么学习一种新的命令行工具就开始有意义了。当然,一旦您知道如何使用 Perl 或 sed 或其他语言,那么您以后执行类似的任务就会节省大量时间和精力。但对于您不希望再次执行的一次性工作,有时像文本编辑器这样的基本交互式工具是最简单的解决方案。

答案4

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

awk -F "_" 'BEGIN { OFS="," }; {gsub(/"/,""); print $1,$2,$3,$4,$5}' input.csv

相关内容