我有一个 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.csv
inputtr
的标准输入流<
,并将结果输出通过管道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,命令行文本处理的“瑞士军队电锯”,也可以做到这一点。语法(并非巧合)与tr
和sed
示例非常相似:
perl -pe 'tr/_"/,/d' input.csv > result.csv
或者:
perl -pe 's/_/,/g; s/"//g' input.csv > result.csv
但老实说,如果您不想仅仅为了这个基本任务而花时间学习一门新的编程语言(实际上 awk、Perl 和 sed 以及其他类似工具就是这样),那么您也可以这样做任何支持搜索和替换的文本编辑器:
在您最喜欢的文本编辑器(例如 gedit、kate、鼠标垫等;甚至 Windows 上的普通旧记事本或写字板也可以执行此操作)中打开 CSV 文件。
从菜单中选择“搜索和替换”(如果没有单独的“搜索”菜单,通常可以在“编辑”下找到)。
输入
_
搜索框,然后,
输入替换框。单击“全部替换”。
在搜索框中重复
"
,并且在替换框中没有任何内容。保存文件。
现在,如果您需要对 100 个或 1000 个文件而不是一个文件执行此操作,那么学习一种新的命令行工具就开始有意义了。当然,一旦您知道如何使用 Perl 或 sed 或其他语言,那么您以后执行类似的任务就会节省大量时间和精力。但对于您不希望再次执行的一次性工作,有时像文本编辑器这样的基本交互式工具是最简单的解决方案。
答案4
为什么不直接更改输入和输出分隔符值的默认值
awk -F "_" 'BEGIN { OFS="," }; {gsub(/"/,""); print $1,$2,$3,$4,$5}' input.csv