我有一个包含记录的文本文件:
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”。在那之后我有点迷失了。
谢谢!
最佳答案
您的 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 对值执行空格标记化和通配符扩展。)
关于Bash 脚本从文本生成 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700492/