如何在bash中将通用标头添加到csv文件中

时间:2015-02-20 22:11:48

标签: bash csv

我想要一个bash脚本将标题行(带有通用列名)添加到CSV文件中。

我的CSV文件内容:

a,b,c,d,e,f,g,h,i,j
a,b,c,d,e,f,g,h,i,j

所需的CSV文件内容:

1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,j
a,b,c,d,e,f,g,h,i,j

我一直在尝试在CSV和ARFF文件格式之间进行转换,但CSV2Arff.java code example from Weka要求输入CSV文件有标题,但我的CSV文件没有。

2 个答案:

答案 0 :(得分:1)

<强>用法:

./add_header.sh "input.csv"

bash脚本(即add_header.sh)将csv文件名作为其1参数。

timestamp=$(date +"%Y-%m-%d_%H-%M")
input_csv_file=$1
output_csv_file="header_"$timestamp"_"$input_csv_file

o=""
# Find the number of columns (commas) in the first row
n=$(($(head -n1 $input_csv_file | sed 's/[^,]//g' | wc -c)))    

for i in $(seq 1 $n);  # Get a list of numbers equal to column qty
do
        o=$o""$i",";
done

#Write the numbers with commas to first line of new file.
echo $o > $output_csv_file              
#Append whole of other file to new file.
cat $input_csv_file >> $output_csv_file 

输出是一个新文件,其中包含标题(以逗号分隔的编号列),后跟原始CSV文件内容。 例如

1,2,3,4,5,6,7,8,9,10,
a,b,c,d,e,f,g,h,i,j
a,b,c,d,e,f,g,h,i,j

答案 1 :(得分:1)

这可以在shell(bash)中的一行中完成。例如,如果使用名为“dat.csv”的示例文件

$ cat dat.csv
a,b,c,d,e,f,g,h,i,j
a,b,c,d,e,f,g,h,i,j

然后

$ cat <(seq -s, 1 $(( `head -n 1 dat.csv | tr -dc "," | wc -c` + 1 ))) dat.csv
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,j
a,b,c,d,e,f,g,h,i,j

你可以把结果放在一个像这样的新文件中:

$ cat <(seq -s, 1 $(( `head -n 1 dat.csv | tr -dc "," | wc -c` + 1 ))) dat.csv > newfile.csv