【问题标题】:Print a column from a CSV files in Linux在 Linux 中从 CSV 文件打印一列
【发布时间】:2013-04-03 11:33:44
【问题描述】:

我有一个非常愚蠢的问题,我以为我可以很容易地回答自己……好吧,我不能。

我有一个文件";",分隔如下:

Grand Hotel  ;Yes;No availability;Dus ;11; . 130,00 ;No availability;500 mt from Arena;

我必须将其打印在一个文件中(将其移动到 Excel 中),如下所示:

大酒店 是的 没有可用性 ...等等等等

如此简单,我只是找不到一个非常简单的解决方案。 因为我正在使用 Debian Bash shell 环境,所以我正在尝试任何东西(bash 脚本、awk、grep)......没有任何效果。 请帮忙。 M.

【问题讨论】:

  • $ cat 文件名 |而读线;回声 $line | tr';' '\n';回声;完成 > 文件名.xls.txt

标签: linux bash csv


【解决方案1】:

所以基本上你想将具有F1;F2;F3;...;FN 形式的行的文件转换为:

 F1
 F2
 F3
 ...
 FN

我们可以使用 tr(1) 将分号翻译成换行符:

tr ';' '\n' < infile

其中“infile”是 CSV 输入文件的名称。

【讨论】:

  • 也没有任何价值,粘贴可以用来做相反的事情:paste -d ';' -s
【解决方案2】:

假设您的文件长于一行,那么当所有字段都在单独的行中时,新的 record 分隔符是什么?

这段awk会将每个字段写在一个新行上,并在每个记录之间添加一个空行。

awk 'BEGIN {FS=";"; OFS="\n"; ORS="\n\n"} {$1=$1} 1'

需要奇数 $1=$1 位来强制 awk 用新的分隔符重写 $0(即当前记录)。

示例:

$ awk 'BEGIN {FS=";"; OFS="\n"; ORS="\n\n"} {$1=$1} 1' << END
a;b;c
d;e;f
END

输出

a
b
c

d
e
f

【讨论】:

    【解决方案3】:

    sed怎么样:

    echo '....' | sed 's/;/\n/g'
    

    【讨论】:

    • @MorganForever 查看 Martin 的回答,tr(1) 也应该可以。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2015-01-23
    • 2019-12-20
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多