【问题标题】:Create 2 new columns using parts of the filename for a csv file使用 csv 文件的部分文件名创建 2 个新列
【发布时间】:2020-03-01 21:25:18
【问题描述】:

我已经设法将我的文件名作为附加列添加到我的文件中,但不知道如何去除文件名中不必要的部分并将我想要的部分放入附加列中。

示例文件名

20191001_export_format_client_platform.csv
20191002_export_format_client_platform.csv
20190928_export_format_client_platform.csv

export_format 部分在所有文件上保持完全相同。唯一改变的是名称开头的日期、客户端名称及其平台名称

输入 csv 数据

visitor_date,browser,id1,id2,id3
30/09/2019 00:00,69246,216370,411751188
30/09/2019 00:00,69247,216370,411751188
30/09/2019 00:14,69246,216370,411511576
30/09/2019 00:14,69246,216370,411751576
30/09/2019 00:14,69246,216370,411751170
30/09/2019 00:14,69246,216370,411751152

我尝试的脚本

awk '{ print $0 FILENAME }' *.csv > *.csv

我尝试的输出

visitor_date,id1,id2,id3,20191001_export_format_client_platform.csv
30/09/2019 00:00,69246,216370,411751188,20191001_export_format_client_platform.csv
30/09/2019 00:00,69247,216370,411751188,20191001_export_format_client_platform.csv
30/09/2019 00:14,69246,216370,411511576,20191001_export_format_client_platform.csv
30/09/2019 00:14,69246,216370,411751576,20191001_export_format_client_platform.csv
30/09/2019 00:14,69246,216370,411751170,20191001_export_format_client_platform.csv
30/09/2019 00:14,69246,216370,411751152,20191001_export_format_client_platform.csv

期望的输出

visitor_date,id1,id2,id3,client,platform
30/09/2019 00:00,692467,2163703,4117511887,client,platform
30/09/2019 00:00,692467,2163703,4117511887,client,platform
30/09/2019 00:14,692467,2163703,4117511576,client,platform
30/09/2019 00:14,692467,2163703,4117511576,client,platform
30/09/2019 00:14,692467,2163703,4117511780,client,platform
30/09/2019 00:14,692467,2163704,4117511528,client,platform

所以从文件名中我应该只取文件名的粗体部分:20191001_export_format_client_platform.csv,然后应该变成 2 个新列

awk 中是否有一种简洁的方法可以做到这一点,或者我需要使用不同的命令来实现结果吗?感谢任何反馈。

【问题讨论】:

  • 使用split_ 上拆分FILENAME。然后在拆分后用逗号和适当的元素打印$0
  • @KamilCuk 感谢您的反馈。意识到我误认为您为 split 命令提议的 awk 拆分。我现在就试试你的建议。
  • @KamilCuk 不幸的是,我似乎无法让 split 命令工作。您能否确认我尝试使用的脚本是否有问题? cat 20191001_export_format_client_platform.csv | awk '{split(FILENAME,a,"_"); print $0, a[4] a[5] }' 我的想法是列出文件,然后通过管道将其拆分FILENAME,然后将文件与print 命令合并。但这显然是不合时宜的。
  • 但是awk 必须知道文件名。做awk .... 20191001_export_format_client_platform.csv。如果你 catawkawk 将不知道文件名 - 只会看到这些行。此外,对于逗号,只需连接 print $0 "," a[4] "," a[5]print 中的 , 将替换为 OFS。 arg,最后有一个.,我们也需要删除它...

标签: linux csv awk command-line


【解决方案1】:

这将是一些事情:

awk '{ split(FILENAME, a, "_"); split(a[5], b, ".");  print $0 "," a[4] "," b[1] }' 20191001_export_format_client_platform.csv

输入:

cat <<EOF >20191001_export_format_client_platform.csv
visitor_date,browser,id1,id2,id3
30/09/2019 00:00,69246,216370,411751188
30/09/2019 00:00,69247,216370,411751188
30/09/2019 00:14,69246,216370,411511576
30/09/2019 00:14,69246,216370,411751576
30/09/2019 00:14,69246,216370,411751170
30/09/2019 00:14,69246,216370,411751152
EOF

它会输出:

visitor_date,browser,id1,id2,id3,client,platform
30/09/2019 00:00,69246,216370,411751188,client,platform
30/09/2019 00:00,69247,216370,411751188,client,platform
30/09/2019 00:14,69246,216370,411511576,client,platform
30/09/2019 00:14,69246,216370,411751576,client,platform
30/09/2019 00:14,69246,216370,411751170,client,platform
30/09/2019 00:14,69246,216370,411751152,client,platform

【讨论】:

    【解决方案2】:

    我会写

    awk '
        BEGIN { FS = OFS = "," }
        FNR == 1 {
            f = FILENAME
            sub(/\.csv$/, "", f)
            n = split(f, a, /_/)
    
            client = a[n-1]
            platform = a[n]
    
            if (out) close(out)
            out = f "-out.csv"
        }
        { print $0, client, platform > out }
    ' *.csv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2020-01-27
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多