所以基本上你想要一个带有文件名和一个数据字符串的表头的表?这是一个可以帮助你的sn-p
#!/bin/bash
HEADER=''
DATA=''
while IFS= read -r -d '' CSV
do
HEADER="${HEADER}$(basename "$CSV"),"
DATA="${DATA}$(cut -d "," -f 2 "$CSV"),"
done < <(find ./ -name "*.csv" -type f -print0)
echo "${HEADER%,}"
echo "${DATA%,}"
首先我们初始化两个空变量,HEADER 将包含我们所有的文件名,DATA 包含每个文件的第二个字段,用, 符号分隔。
之后我们有一个 while 循环,它可能看起来很复杂,但这里解释了其原因:https://github.com/koalaman/shellcheck/wiki/SC2044
TLDR 版本是我们要处理所有可能破坏 for 循环的异常字符。
在循环中,我们将包含在CSV 变量中的文件名附加到HEADER 变量中。 basename 只给我们文件名部分,没有文件夹。如果你不需要.csv 扩展,你可以在那里使用basename -s .csv "$CSV" 作为命令。
DATA 以相同的方式处理,但我们将文件内容按, 拆分并仅打印第二个字段。
在形成两个字符串后,我们用删除的尾随逗号来回显它们,这种技术称为 bash 参数替换,请查看 https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html 了解更多信息。
此脚本将处理当前目录及其子目录中的所有 csv 文件。
要从中创建文件,只需将其输出重定向到文件,即将此脚本另存为 merge_csv.sh 并运行
bash merge_csv.sh > bonding.csv
测试:
生成5个内容相似的文件:
for i in $(seq 1 5); do echo "0.0000000000e+00,$i.0000000000e+00" > "$i.csv"; done
在文件夹中运行此脚本会导致:
1,2,3,4,5
1.0000000000e+00,2.0000000000e+00,3.0000000000e+00,4.0000000000e+00,5.0000000000e+00