我有一个文本文件,想要在转换之前将其转换为csv文件,我想向文本文件添加标头,以便csv文件具有相同的标头。我的文本文件中有1000列,并且想要有1000列的名称。作为附带说明,文本文件的内容只是一些数字的行,并用逗号“,”分隔。有什么办法可以在bash中添加标题行?
我尝试了以下方法,但没有成功。我首先在python中执行了以下命令。
> for i in range(1001):
> print "col" + "_" + "i"
使用以下命令(python header.py >> header.txt)将其输出保存在文本文件中,并将此输出以文本文件格式添加到原始文本文件中,如下所示:
cat header.txt filename.txt> newfilename.txt
然后使用“ mv newfilename.txt newfilename.csv”将txt文件转换为csv文件。 但是不幸的是,由于某种原因,标题行的其他行数是原来的两倍,因此这种方法行不通。感谢您为解决此问题提供的帮助。
答案 0 :(得分:1)
根据描述,您的文件已经用逗号分隔,因此csv文件也是如此。您只想添加列号标题行。
$ awk -F, 'NR==1{for(i=1;i<=NF;i++) printf "col_%d%s", $i,(i==NF?ORS:FS)}1' file
添加的列标题与文件第一行中的字段一样多
例如
$ seq 5 | paste -sd, | # create 1,2,3,4,5 as a test input
awk -F, 'NR==1{for(i=1;i<=NF;i++) printf "col_%d%s", i, (i==NF?ORS:FS)}1'
col_1,col_2,col_3,col_4,col_5
1,2,3,4,5
答案 1 :(得分:0)
您可以使用以下选项之一在bash中生成列名称。每个示例均生成一个header.txt文件。您已经有代码将其作为标题添加到文件的开头。
多次循环的bash循环效率不高,但可以正常工作。
for i in {1..10}; do
echo -n "col_$i "
done > header.txt
echo >> header.txt
或使用seq
for i in $(seq 1 1000); do
echo -n "col_$i "
done > header.txt
echo >> header.txt
仅使用seq会更有效。
seq -f "col_%g" -s" " 1 1000 > header.txt
答案 2 :(得分:0)
您可以使用 seq 实用程序来构造CSV标头,而Bash扩展则需要一点帮助。然后,您可以将新的标题行插入到现有的CSV文件中,或将标题与数据连接起来。
例如:
# construct a quoted CSV header
columns=$(seq -f '"col_%g"' -s', ' 1 1001)
# strip the trailing comma
columns="${columns%,*}"
# insert headers as first line of foo.csv with GNU sed
sed -i -e "1 i\\${columns}" /tmp/foo.csv
如果您没有GNU sed,您也可以使用cat,海绵或其他工具来连接标题和数据,尽管大多数连接选项都需要重定向到新的合并文件,以避免破坏现有数据
例如,以 /tmp/data.csv 作为原始数据文件:
seq -f '"col_%g"' -s', ' 1 1001 > /tmp/header.csv
sed -i -e 's/,[[:space:]]*$//' /tmp/header.csv
cat /tmp/header /tmp/data > /tmp/new_file.csv
另外,请注意,虽然可以避免调用标准实用程序的Bash解决方案,但对于大型数据集,在纯Bash中执行它可能太慢或占用大量内存。
您的里程可能会有所不同。
答案 3 :(得分:0)
printf "col%s," {1..100} |
sed 's/,$//' |
cat - filename.txt >newfilename.txt
我认为sed
应该提供缺少的最终换行符,这是一个副作用。如果不是,也许也尝试's/,$/\n/'
,尽管这也不是完全可移植的。您也可以将cat
替换为sed
,类似
... | sed 's/,$//;r filename.txt'
但是,我也不完全确定它的便携性。