首页 > 解决方案 > 将文件名中的子字符串附加到 CSV 的每一行

问题描述

我有一个包含一些 .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请注意, in中的所有行都, 1附加到每一行,并且 in file2.csv, 2附加到每一行。如果文件名是fileN.csv我想, N附加到每一行。可以假设每个文件只有 1 个数字 ( 0-9)。

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

标签: bashshellcsv

解决方案


你会尝试以下方法:

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

组合.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

推荐阅读