首页 > 解决方案 > 使用 shell 脚本获取每行中存在的文件的文件扩展名

问题描述

如何获取以下显示数据的文件扩展名。显然,我在 csv 文件中有数百万行。

col1                             ,col2     ,col3                        ,col4     , col5, col6, col7
aaaaa/                           ,0        ,2018-03-16T09:31:42.000Z,   xx-daily.......
aaaaa/201802/                    ,0        ,2019-01-17T06:16:34.000Z,   xx-daily
aaaaa/201802/Feb2018000000_0.gzip,32602738,2018-09-11T04:05:38.000Z,    xx-daily
aaaaa/201802/Feb2018000001_0.gzip,32602738,2018-09-11T04:05:38.000Z,    xx-daily
aaaaa/201802/Feb2018000002_0.gzip,32602738,2018-09-11T04:05:38.000Z,    xx-daily
aaaaa/201802/Feb2018000003_0.gzip,32602187,2018-09-11T04:05:38.000Z,    xx-daily
aaaaa/201802/Feb2018000004_0.gzip,32602187,2018-09-11T04:05:39.000Z,    xx-daily
aaaaa/201802/Feb2018000005_0.gzip,32602187,2018-09-11T04:05:39.000Z,    xx-daily
aaaaa/201802/Feb2018000006_0.gzip,32578449,2018-09-11T04:05:39.000Z,    xx-daily

我需要拆分文件扩展名并创建另一列来填充同一 csv 文件中的文件扩展名值。

需要如下输出

col1                             ,col2     ,col3                        ,col4     , col5, col6, col7
aaaaa/                                      ,0         ,2018-03-16T09:31:42.000Z,   xx-daily.......
aaaaa/201802/                               ,0         ,2019-01-17T06:16:34.000Z,   xx-daily
aaaaa/201802/Feb2018000000_0.gzip, gzip     ,32602738,2018-09-11T04:05:38.000Z, xx-daily
aaaaa/201802/Feb2018000001_0.gzip, gzip     ,32602738,2018-09-11T04:05:38.000Z, xx-daily
aaaaa/201802/Feb2018000002_0.gzip, gzip     ,32602738,2018-09-11T04:05:38.000Z, xx-daily

标签: shellfile

解决方案


这有点笨拙,没有添加您似乎想要的空格,并在那些没有文件扩展名的行中引入了一个空白列(我相信这是正确的行为,并且很容易修改它以停止这样做如果你喜欢)。但是,在任何情况下,我都不会容忍回写到您正在阅读的同一文件中。awk 的一些实现提供了这样做的功能,但使用它是错误的。使用过滤器并将输出写入不同的文件。如果需要,您可以覆盖原始文件。

awk '{c=split($1,a,"."); ext=c>1?a[c]:""; $2=ext OFS $2}1' FS=, OFS=, input-file

您可以通过以下方式获得更好的间距:

awk '{c=split($1,a,"."); ext=c>1?a[c]:""; $2=ext OFS $2}1' FS=, OFS=',\t' input

你可以避免空列(但你真的不想这样做):

awk '{c=split($1,a,"."); if( c > 1) $2=a[c] OFS $2}1' FS=, OFS=',\t' input

推荐阅读