我有一个包含记录的文本文件:
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;。那之后我有点失落。
谢谢!
答案 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