【问题标题】:Convert .txt file to .csv with header in bash将 .txt 文件转换为 .csv,并在 bash 中使用标题
【发布时间】:2013-06-07 15:14:51
【问题描述】:

.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 得到这个结果?

【问题讨论】:

  • .csv 文件上的分隔符是什么? tab?
  • CSV 是“逗号分隔值”...CSV 文件的分隔符应该是逗号。当然,显示的布局表明它是一个 TSV(制表符分隔值)文件。

标签: bash shell csv


【解决方案1】:

应该这样做,如果您的字段不包含任何有趣的业务:

(echo "Date;Visit;Login;Euro;Rate" ; cat file.txt) | sed 's/;/<tab>/g' > file.csv

您只需在 bash (^V TAB) 中按字面意思键入一个制表符。如果你的 sed 版本支持它,你可以写\t 而不是文字标签。

【讨论】:

  • bash(和其他支持它的shell)中,即使你的sed不支持\t,你也可以使用特殊的引用$'s/;/\t/g'
【解决方案2】:

你可以使用 awk :

echo -e "Data\tVisit\tLogin\tEuro\tRate" > newfile; awk -F';' ' {$1=$1}1' OFS="\t" file >> newfile

{$1=$1}1 是强制使用新字段分隔符的技巧。

echo-e 强制将制表符解释为制表符。

编辑:改变管道 |到 & 然后到 ;

【讨论】:

  • 管道什么也不做,因为来自echo 的所有输出都被定向到文件,而awk 被赋予了一个要读取的文件并忽略其标准输入。
  • 是的,你是对的,没有什么要管的,我的意思是“&”当然:p(但它仍然有效)
  • 你甚至不需要&amp;,因为回显几乎会立即完成;只需使用分号。
  • 你知道吗,我想我很少用;在我的一生中。我从来没有想过-_-'也许是时候改变它了......
  • 不用分号;只需将这两个命令放在两个单独的行上。或者使用单个重定向:{ echo ...; awk ...; } &gt; newfile 其中,如果您将其全部放在一行中(如在评论中),您确实需要 both 分号,但如果您将其分散到 4 行中(大括号单独放在一行上,第二个之后是 I/O 重定向),那么你不需要任何分号。
【解决方案3】:

这是一个纯 bash 解决方案。将标头存储在一个数组中,并将 IFS 设置为 tab,然后设置 echo 标头。用read循环遍历文件,在进入的过程中设置IFS;,设置 IFStab 并在退出时运行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多