![如何将 CSV 文件中的单列拆分为多列](https://linux22.com/image/136473/%E5%A6%82%E4%BD%95%E5%B0%86%20CSV%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%8D%95%E5%88%97%E6%8B%86%E5%88%86%E4%B8%BA%E5%A4%9A%E5%88%97.png)
我的 csv 文件中有以下文本,需要将 FILE 和 TIMESTAMP 放入 csv 文件的单独列中。您能否让我知道如何实现这一目标。
FILE, TIMESTAMP
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/server/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxReceiptCreateCO.java, Thu 28 Jun 2018 09:00:43 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxOlympusReceiptPG.xml, Thu 28 Jun 2018 05:16:46 AM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCPPV.rdf, Thu 28 Jun 2018 12:31:29 PM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCIPS.rdf, Thu 28 Jun 2018 12:31:40 PM EDT
注意:我尝试过列命令,但没有帮助。
答案1
道路sed
如果您想,␣
用文件中的表格替换逗号空格 ( ),您可以通过 sed 管道传输其内容。这是一个例子
$ echo '/apps/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT' | sed 's:, :\t:g'
/apps/XxReceipt.java Thu 28 Jun 2018 02:49:45 AM EDT
解释:
- 周围的简单引号
s:, :\t:g
告诉 shell 将字符串作为单个参数按原样提供给 sed。 - 对于 sed,
s
第一个位置意味着替换 :
是模式/替换分隔符,␣
是要匹配的模式\t
是模式替换——表格的转义序列- g(全局)告诉 sed 替换该行的每个匹配项,而不仅仅是第一个。
如果需要使用 sed 匹配更复杂的模式,可以使用开关-E
,以便将模式解释为正则表达式。如果您为每个表达式添加前缀,则可以链接多个 sed 表达式-e
。
如果 csv 数据位于文件中,则以下是如何通过 sed 通过管道传输它:
cat my-data.csv | sed 's:, :\t:g' | tee my-data.tsv
或者
cat my-data.csv | sed 's:, :\t:g' > my-data.tsv
答案2
我读这个问题的方式是你想要创造给定文件列表的 CSV 格式输出。另一种解释请参见本答案末尾。
这是一个可以执行此操作的 shell 脚本。它使用 Linux 版本来stat
获取上次修改的时间戳。
#!/bin/sh
echo "PATHNAME,TIMESTAMP"
stat -c '"%n",%y' "$@"
输出标头后,此脚本只需stat
调用命令行上提到的路径名即可获取上次修改的时间戳(请参阅系统上的手册stat
以了解如何更改此设置)。它打印路径名(带引号)和时间戳。
你可以用它作为
sh script.sh PATTERN >outputfile
例如:
$ sh script.sh *.log* *.tar >file.cvs
$ cat file.cvs
PATHNAME,TIMESTAMP
"dsmerror.log",2018-07-17 13:00:02.911711652 +0200
"dsminstr.log",2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak",2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock",2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar",2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar",2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar",2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar",2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar",2018-04-25 09:44:15.518486626 +0200
由于脚本很短,它的命令可以直接写在命令行上。上面示例的等效命令行是
$ { echo "PATHNAME.TIMESTAMP"; stat -c '"%n",%y' *.log* *.tar; } >file.cvs
现在,当我们有了这个文件时,我们可能希望对其进行良好的格式化以用于报告目的:
$ column -s, -t file.csv
PATHNAME TIMESTAMP
"dsmerror.log" 2018-07-17 13:00:02.911711652 +0200
"dsminstr.log" 2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak" 2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock" 2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar" 2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar" 2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar" 2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar" 2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar" 2018-04-25 09:44:15.518486626 +0200
除非任何路径名包含逗号,否则此方法有效。
要使用 CSV 解析器正确格式化它,它也可以处理包含逗号的路径名:
$ csvlook file.csv
| PATHNAME | TIMESTAMP |
| ------------------------ | ----------------------------------- |
| dsmerror.log | 2018-07-17 13:00:02.911711652 +0200 |
| dsminstr.log | 2018-07-17 13:00:04.079726608 +0200 |
| dsminstr.log.bak | 2018-05-13 18:00:03.231791181 +0200 |
| dsminstr.log.lock | 2018-07-17 13:00:04.079726608 +0200 |
| archive_20170823-old.tar | 2017-08-22 16:44:23.037803149 +0200 |
| archive_20170823.tar | 2017-08-23 09:35:28.956158119 +0200 |
| archive_20180409.tar | 2018-04-09 09:47:29.472374428 +0200 |
| archive-chr22.tar | 2018-06-19 14:50:45.896447161 +0200 |
| gene_cache.tar | 2018-04-25 09:44:15.518486626 +0200 |
csvlook
是其一部分csvkit
,一个用于处理 CSV 文件的 Python 工具包。