如何使用Shell脚本在不同数据之间添加标题行来将CSV转换为Excel?

时间:2019-02-27 08:57:40

标签: bash shell awk

我想逐行处理CSV文件,如果table_name不同,则需要添加标题行。

示例CSV:

table_name,no.,data 
attribute,column_name,definition,data_type,valid_values,notes
archive_rule,1,ID,id,,int,,
archive_rule,2,EXECUTE SEQ,execute_seq,,int,,
archive_rule,3,ARCHIVE RULE NAME,archive_rule_name,,varchar,,
archive_rule,4,ARCHIVE RULE TABLE NAME,archive_rule_table_name,,varchar,,
archive_rule,5,ARCHIVE RULE PK NAME,archive_rule_pk_name,,varchar,,
archive_rule,6,ARCHIVE BATCH SIZE,archive_batch_size,,int,,
archive_rule,7,ACTIVE STATUS,active_status,,varchar,,
archive_table,1,ID,id,,int,,
archive_table,2,ARCHIVE RULE ID,archive_rule_id,,int,,
archive_table,3,EXECUTE SEQ,execute_seq,,int,,
archive_table,4,ARCHIVE DEPEND TABLE ID,archive_depend_table_id,,int,,
archive_table,5,ARCHIVE DEPEND LEVEL,archive_depend_level,,int,,
archive_table,6,ACTIVE STATUS,active_status,,varchar,,
batch_job,1,BATCH JOB ID,batch_job_id,,int,,
batch_job,2,JOB TYPE,job_type,,varchar,,
batch_job,3,JOB NAME,job_name,,varchar,,
batch_job,4,EXECUTION DATE,execution_date,,timestamp,,
batch_job,5,EXECUTION RESULT,execution_result,,varchar,,
batch_job,6,ERROR MESSAGE,error_message,,varchar,,
batch_job,7,REPORT OUTPUT,report_output,,varchar,,

所需结果:

Data : archive_rule
no.,data attribute,column_name,definition,data_type,valid_values,notes
1,ID,id,,int,,
2,EXECUTE SEQ,execute_seq,,int,,
3,ARCHIVE RULE NAME,archive_rule_name,,varchar,,
4,ARCHIVE RULE TABLE NAME,archive_rule_table_name,,varchar,,
5,ARCHIVE RULE PK NAME,archive_rule_pk_name,,varchar,,
6,ARCHIVE BATCH SIZE,archive_batch_size,,int,,
...
Data: archive_table
no.,data attribute,column_name,definition,data_type,valid_values,notes
1,ID,id,,int,,
2,ARCHIVE RULE ID,archive_rule_id,,int,,
3,EXECUTE SEQ,execute_seq,,int,,
4,ARCHIVE DEPEND TABLE ID,archive_depend_table_id,,int,,
5,ARCHIVE DEPEND LEVEL,archive_depend_level,,int,,
...

请帮助我找到一种获取输出的方法。

2 个答案:

答案 0 :(得分:3)

我在这里只能想象一种方式:逐行读取输入文件,并使用cut提取第一个字段。这应该可以解决问题:

#! /bin/bash

# accept both process.sh file and process.sh < file
if [ $# -eq 1 ]
then file="$1"
else file=-
fi

#initialize table name to the empty string
cur=""

# process the input line by line after skipping the header
cat "file" | tail +3 | (
while true
do
    read line
    if [ $? -ne 0 ]    # exit loop on end of file or error
    then
        break
    fi
    tab=$( echo $line | cut -f 1 -d, )   # extract table name
    if [ "x$tab" != "x$cur" ]
    then
        cur=$tab                     # if a new one remember it
        echo "Data: $tab"            # and write header
        echo "no.,data attribute,column_name,definition,data_type,valid_values,notes"
    fi
    echo $line | cut -f 2- -d,           # copy all except first field
done )

但是我会在这里使用真正的脚本语言,例如Ruby或Python ...

答案 1 :(得分:0)

使用awk:

Future.collect

输出:

Future[Seq[Foo]]