合并到单个文件中时,将每个文件的文件名添加为分隔符行Bash脚本

时间:2018-12-04 10:40:38

标签: bash shell

我拥有当前的脚本,该脚本将一个文件夹中的所有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"

2 个答案:

答案 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

不将输出与输入保存在同一目录中,这会消除烦人的案例处理。