Bash 从文本生成 csv 文件的脚本

Bash Script to generate csv file from text

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

  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 

我知道字段分隔符是“\n”。在那之后我有点迷路了。

谢谢!

你创建第二个字段:

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

祝你好运!

你的 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替换为""即可。您可以类似地参数化输出文件名,但我会简单地删除输出重定向,并将其留给调用者来决定如何处理脚本的输出。

如果您需要读取多个字段并以逗号分隔,请调整您的 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

(printfecho 更推荐,特别是当你的输出要求很重要时。我没有特别引用 $i 来去掉 [=20 添加的任何前导空格=] 在行号之前。否则,您通常应该始终在变量周围使用双引号,除非您特别要求 shell 对值执行空白标记化和通配符扩展。)

如果您安装了 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 评论,添加 header 行:

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,""/'

或保存

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

到一些文件中,例如 "makecsv" 并将其用作

./makecsv < data

Ps:嗯.. @tripleee 的 nlcat -n 更短 ;)

将其保存在文件中,例如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

优点是input/output文件名不是hardcoded