bash脚本中的字符串修改

时间:2012-02-09 12:14:26

标签: bash

我正在尝试从csv文件生成SQL表头。因为我遇到了一些麻烦,我写了一个测试片段,这是我到目前为止所得到的:

#!/bin/bash
function quote {
   for i ; do
#       echo "\`$i\`"
        echo "\`$i\` varchar (100),\n"
   done
}

quote $(head -1 Zustaendigkeit.csv | sed 's/;/ /g')

这是我使用的csv行:

茨;大街; PLZ_Ort;土地;金额; Amt_Nr; PLZ;的Ort

这是我使用上述代码段获得的内容:

[root@db ~]
 174# ./tst.sh
`Netz` varchar (100),\n
`Strasse` varchar (100),\n
`PLZ_Ort` varchar (100),\n
`Land` varchar (100),\n
`Amt` varchar (100),\n
`Amt_Nr` varchar (100),\n
`PLZ` varchar (100),\n
` varchar (100),\n

在最后一行中,它遗漏了Ort at the beginning of the line. When I use only "echo "\ $ i`“”,我在上面的代码段中对此进行了评论:

[root@db ~]
 170# ./tst.sh
`Netz`
`Strasse`
`PLZ_Ort`
`Land`
`Amt`
`Amt_Nr`
`PLZ`
`Ort

缺少最后一个`

希望有人找不到我的链接......

格尔茨 的Mirco

2 个答案:

答案 0 :(得分:2)

您可能在该行的末尾有一个Windows行结尾。删除它:sed 's/\r//g'

您可以使用循环并将IFS设置为sed,而不是使用;。删除\r是通过参数扩展完成的。

IFS=';'
read -a a < Zustaendigkeit.csv
for b in "${a[@]}" ; do
    echo "\`${b%$'\r'}\` varchar(100)"
done

答案 1 :(得分:1)

为什么不awk?我曾经这样做过:

 awk -v Q="'" -F "," 'NR==1 { print "create table SOMETABLE ("
                              for (i=1;i<NF;i++) {
                                  print $i " varchar2(100), "
                              }
                              print $NF " varchar2(100) );"
                      }
                      NR%1000 == 0 { print "commit;" }
                      { print "insert into SOMETABLE values ( "
                        for (i=1;i<NF;i++) {
                             print Q $i Q ", "
                        }
                        print Q $NF Q " );"
                      }
                      END { print "commit;"
                            print "exit;"
                      }' INPUT.CSV > SQL.sql