Bash脚本从文本生成csv文件

时间:2015-02-24 16:00:47

标签: bash shell sh export-to-csv

我有一个包含记录的文本文件:

  Data1

  Data2

  ...

  Data50

我必须使用以下格式从上面的文本文件创建.csv文件:

Type |  Count | Name

Def |    u1 |    Data1

Def |    u2  |     Data2

....  |  .....   |  ....

Def  |   u50   | Data50

我需要一个bash脚本来从文本文件生成.csv文件。我是shell脚本的新手!我已经完成了awk和sed的基础知识。 我有一个模糊的想法:

#!/bin/bash
type="Def"
x=1
count="u"
for F in ../test.txt
do
    {
       read \n
       echo "$type, $count$x, $..." >> ../test.csv
       x=x+1
    } < $F

done 

我明白字段分隔符是&#39; \ n&#39;。那之后我有点失落。

谢谢!

4 个答案:

答案 0 :(得分:3)

你的for循环只会循环一次,它会遍历你列出的标记,你只列出一个(看起来像文件名,所以我猜你想要循环遍历行在文件中):

#!/bin/bash
type="Def"
x=1
count="u"
while read value; do
   echo "$type, $count$x, $value"
   let x++
done <../test.txt > ../test.csv

您还可以使用外部实用程序来运行数字:

nl ../test.txt |
while read -r x value; do
    echo "$type,$count$x,$value"
done >../test.csv

在循环外部重定向更有效,因为shell不必关闭并重新打开输出文件。

如果要在命令行上传入变量文件名,只需将硬编码的../test.txt替换为"$1"即可。您可以类似地参数化输出文件名,但我只是删除输出重定向,并将其留给调用者以决定如何处理脚本的输出。

如果您需要阅读多个字段并使用逗号分割,请调整IFS

nl -s , ../test.txt |
while IFS=, read -r i first second rest; do
    printf "%i,%s,u%i,%s\n" $i "$first" "$second" "$rest"
done

(建议printf超过echo,特别是如果您的输出要求非常重要。我没有专门引用$i来删除nl添加的任何前导空格除非您特别要求shell对值执行空白标记化和通配符扩展,否则通常应始终在变量周围使用双引号。)

答案 1 :(得分:1)

如果你安装了perl,那么

perl -lnE 'say qq{Def,u$.,"$_"}' < inputfile

将完成这项工作。

演示:

seq -f 'Some Data%g' 50会生成以下行:

Some Data1
Some Data2
...
Some Data50

所以

seq -f 'Some Data%g' 50 | perl -lnE 'say qq{Def,u$.,"$_"}'

打印

Def,u1,"Some Data1"
Def,u2,"Some Data2"
...
Def,u49,"Some Data49"
Def,u50,"Some Data50"

我引用了最后一个字段,因为在输入中你可以获得,或空格。

基于@Roland评论,添加标题行:

cat data | (echo 'Type,Count,Name' ; perl -lnE 'say qq{Def,u$.,"$_"}')

perl -lnE 'BEGIN{say q{Type,Count,Name}}say qq{Def,u$.,"$_"}'

如果您想要bash解决方案,只需使用:

cat -n filename | sed 's/ *\(.*\)\t\(.*\)/Def,u\1,"\2"/'

或保存

cat -n - | sed 's/ *\(.*\)\t\(.*\)/Def,u\1,"\2"/'

进入某个文件,例如“makecsv”并将其用作

./makecsv < data

Ps:嗯.. @ tripleee的nl缩短为cat -n;)

答案 2 :(得分:0)

您使用以下内容创建第二个字段:

x = `expr $x + 1`
$count$x

整个脚本变为:

#!/bin/sh

echo Type,Count,Name > test.csv
x=0
for f in `cat test.txt`
do
   x=`expr $x + 1`
   echo Def,u$x,$f >> test.csv
done

祝你好运!

答案 3 :(得分:0)

将其保存在文件中,例如makecsv.rc:

#!/bin/sh
echo Type,Count,Name
x=0
for f in `cat`
do
   x=`expr $x + 1`
   echo Def,u$x,$f
done

然后运行:

cat  ../test.txt | ./makecsv.rc > ../test.csv

如果需要,请执行chmod +x makecsv.rc

优点是输入/输出文件名不是hardcoded