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
(printf
比 echo
更推荐,特别是当你的输出要求很重要时。我没有特别引用 $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 的 nl
比 cat -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
我有一个包含记录的文本文件:
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
(printf
比 echo
更推荐,特别是当你的输出要求很重要时。我没有特别引用 $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 的 nl
比 cat -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