如何在bash中将标题添加到文本文件?

时间:2018-08-27 17:50:46

标签: bash csv header text-files

我有一个文本文件,想要在转换之前将其转换为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文件。 但是不幸的是,由于某种原因,标题行的其他行数是原来的两倍,因此这种方法行不通。感谢您为解决此问题提供的帮助。

4 个答案:

答案 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循环

多次循环的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会更有效。

seq -f "col_%g" -s" " 1 1000 > header.txt

答案 2 :(得分:0)

使用seq和sed

您可以使用 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'

但是,我也不完全确定它的便携性。