将.txt文件转换为.csv,并在bash中使用头文件

将.txt文件转换为.csv,并在bash中使用头文件,bash,shell,csv,Bash,Shell,Csv,.txt看起来像: 2013-04-10;248179;5431;5375.30€;1.49 .. .. .. 我需要一个带有标题的.csv文件: Date Visit Login Euro Rate 2013-04-10 248179 5431 5375.30€ 1.49 .. .. .. .. .. .. .. .. .. .. 有没有办法通过BASH获得这

.txt看起来像:

2013-04-10;248179;5431;5375.30€;1.49
..
..
..
我需要一个带有标题的.csv文件:

Date       Visit   Login  Euro      Rate
2013-04-10 248179  5431   5375.30€  1.49
..         ..      ..     ..        ..
..         ..      ..     ..        ..
有没有办法通过BASH获得这个结果?

如果您的字段不包含任何有趣的内容,那么应该这样做:

(echo "Date;Visit;Login;Euro;Rate" ; cat file.txt) | sed 's/;/<tab>/g' > file.csv
您只需在bash ^V选项卡中按字面意思键入一个选项卡。如果您的sed版本支持它,您可以编写\t而不是文字选项卡。

您可以使用awk:

echo -e "Data\tVisit\tLogin\tEuro\tRate" > newfile; awk -F';' ' {$1=$1}1' OFS="\t" file >> newfile
{$1=$1}1是一个强制使用新字段分隔符的技巧

带有-e的echo强制将制表符解释为制表符


编辑:将管道|更改为&然后更改为

这是一个纯bash解决方案。将标题存储在数组中,并将IFS设置为tab,然后回显标题。循环读取文件,将IFS设置为;在进来的路上,集合 如果要在退出时锁定并运行echo

headers=(Date       Visit   Login  Euro      Rate)
((IFS=$'\t'; echo "${headers[*]}"); 
while IFS=';' read -r -a arr; do
(IFS=$'\t'; echo "${arr[*]}";)
done < test.fil) > test.csv

.csv文件上的分隔符是什么?制表符?CSV为“逗号分隔值”…CSV文件的分隔符应为逗号。当然,显示的布局表明它是一个TSV制表符分隔值文件。管道不起任何作用,因为echo的所有输出都被定向到该文件,而awk被赋予一个可读取的文件并忽略其标准输入。是的,你是对的,没有什么可管的,我的意思是a&当然:p,但它无论如何都能工作,你甚至不需要&,因为回音几乎马上就会完成;用分号就行了。你知道吗,我想我很少用分号;在我的一生中。我从来没有想过-u-'也许是时候改变这一点了…不需要使用分号;只需将这两个命令放在两个单独的行上。或者使用一个重定向:{echo…;awk…;}>newfile,其中,如果将所有内容都放在一行中作为注释,则确实需要两个分号,但如果将其分散在4行上,则括号单独放在一行上,在第二行之后进行I/O重定向,则不需要任何分号。在bash和其他支持分号的shell中,您可以使用特别报价$'s//\t/g'即使您的sed不支持\t。