如何将 CSV 文件中的单列拆分为多列

如何将 CSV 文件中的单列拆分为多列

我的 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 工具包。

相关内容