【问题标题】:Append substring from filename to each row of CSV将文件名中的子字符串附加到 CSV 的每一行
【发布时间】:2020-06-16 10:51:18
【问题描述】:

我有一个包含一些 .CSV 文件的文件夹:

/folder/
  file1.csv
  file2.csv
  file3.csv
  ...

每个文件包含大约 500 行 CSV。我想连接这些文件,但将文件名中的数字附加到每个文件中每一行的末尾。

所以如果file1.csv 是:

0.00, 1.00, 0.54, 0.29
0.10, 1.00, 0.32, 0.92
0.31, 0.94, 0.22, 0.22

file2.csv 是:

0.50, 1.00, 0.84, 0.23
0.16, 0.40, 0.92, 0.94
0.34, 0.54, 0.62, 0.62

我希望我的最终输出是 combined.csv,看起来像这样:

0.00, 1.00, 0.54, 0.29, 1
0.10, 1.00, 0.32, 0.92, 1
0.31, 0.94, 0.22, 0.22, 1
0.50, 1.00, 0.84, 0.23, 2
0.16, 0.40, 0.92, 0.94, 2
0.34, 0.54, 0.62, 0.62, 2

请注意,file1.csv 中的所有行都有一个 , 1 附加到每一行,而在 file2.csv 中,, 2 附加到每一行。如果文件名是fileN.csv,我希望将, N 附加到每一行。可以假设每个文件只有 1 个数字 (0-9)。

我已经知道如何连接 .CSV 文件:cat *.csv > combined.csv,但是如何获取文件编号并将该编号附加到每一行?

【问题讨论】:

    标签: bash shell csv


    【解决方案1】:

    对每个文件尝试sed 's/$/ file_number/' filename,然后 cat filename.csv >> combined.csv

    【讨论】:

      【解决方案2】:

      这是适合您的 awk / sed 组合:

      awk '
        { print $0 "," FILENAME } 
      ' *.csv | sed 's/,[A-Za-z]*\([0-9]\).csv$/, \1/'
      

      假设所有文件名看起来都类似于 fileX.csv,但您可以使用 sed 部分来匹配您的输入。

      【讨论】:

        【解决方案3】:

        你会尝试以下方法:

        cd folder
        for f in file*.csv; do
            num=${f//[^0-9]/}        # extract number from the filename
            sed "s/$/, $num/" "$f"   # append the number to each line
        done > combined.csv
        

        combined.csv:

        0.00, 1.00, 0.54, 0.29, 1
        0.10, 1.00, 0.32, 0.92, 1
        0.31, 0.94, 0.22, 0.22, 1
        0.50, 1.00, 0.84, 0.23, 2
        0.16, 0.40, 0.92, 0.94, 2
        0.34, 0.54, 0.62, 0.62, 2
        

        【讨论】:

          猜你喜欢
          • 2019-09-20
          • 1970-01-01
          • 2012-12-29
          • 2011-12-27
          • 1970-01-01
          • 2016-04-11
          • 1970-01-01
          • 2018-04-26
          • 2011-10-30
          相关资源
          最近更新 更多