我拥有当前的脚本,该脚本将一个文件夹中的所有CSV文件组合到一个CSV文件中,并且效果很好。我需要添加功能以将原始csv的文件名添加为每个数据块的标题行,因此我知道哪个部分是哪个。
有人可以帮忙吗,因为这不是重点,而我不在乎
#!/bin/bash
OutFileName="./Data/all/all.csv" # Fix the output name
i=0 # Reset a counter
for filename in ./Data/all/*.csv; do
if [ "$filename" != "$OutFileName" ] ; # Avoid recursion
then
if [[ $i -eq 0 ]] ; then
head -1 $filename > $OutFileName # Copy header if it is the first file
fi
tail -n +2 $filename >> $OutFileName # Append from the 2nd line each file
i=$(( $i + 1 )) # Increase the counter
fi
done
我将使其自动化并在Apple automator中使用并运行Shell脚本。
谢谢您的帮助。
这是导入和输出的文件之一示例 Example of current input file Once combined I need the filename where the "headers are"
答案 0 :(得分:0)
当您想生成类似...的东西
Header1,Header2,Header3
file1.csv
a,b,c
x,y,z
file2.csv
1,2,3
9,9,9
file3.csv
...
...那么您只需要在echo "$filename" >> "$OutFileName"
命令前面插入一个tail
。这是脚本的更新版本,做了一些小的改进。
#!/bin/bash
out="./Data/all/all.csv"
i=0
rm -f "$out"
for file in ./Data/all/*.csv; do
(( i++ == 0)) && head -1 "$file"
echo "$file"
tail -n +2 "$file"
done > "$out"
答案 1 :(得分:0)
除了CSV文件的第一行外,没有“标题行”的概念。您可以做的就是添加一个新列。
我改用Awk是因为它大大简化了脚本。您的原件实际上是单线的。
awk -F , 'NR==1 { OFS=FS; $(NF+1) = "Filename" }
FNR>1{ $(NF+1) = FILENAME }1' all/*.csv >all.csv
不将输出与输入保存在同一目录中,这会消除烦人的案例处理。