【问题标题】:Command 'cut' doesn't show last column CSV命令“剪切”不显示最后一列 CSV
【发布时间】:2019-08-02 17:11:25
【问题描述】:

我已经从 shell 创建了一个 CSV。然后我需要按列过滤信息。我使用了这个命令:

$cut -d ';' -f 12,22 big_file.csv

输入看起来像:

ACT;XXXXXX;MCD;881XXXX;881017XXXXXX;ABCD;BMORRR;GEN;88XXXXXXXXXX;00000;01;2;000008608008602;AAAAAAAAAAA;0051;;;;;;093505;
ACT;XXXXXX;MCD;881XXXX;881017XXXXXX;ABCD;BMORRR;GEN;88XXXXXXXXXX;00000;01;3;000008608008602;AAAAAAAAAAA;0051;;;;;;085000;anl@mail.com

输出是:

ID CLIENT;email
00000xxxxxxxxx
00000000xxxxxx;anl@mail.com

如您所见,最后一列没有出现(请注意,第一行中缺少分号)。我想要这个:

ID CLIENT;email
00000xxxxxxxxx;
00000000xxxxxx;anl@mail.com

我有另一个包含信息的 CSV 文件,它可以工作。我已经查看了 csv 并且这些列存在。

【问题讨论】:

  • 输入是什么样的?即使输入行没有第 22 列,你想要一个尾随分号是否有问题?
  • 请在您的问题中添加示例输入(无描述、无图像、无链接)和该示例输入所需的输出(无评论)。
  • 好的。我添加了一个输入。
  • echo "a;b;" | cut -d';' -f1,3 确实输出 a;。您确定没有电子邮件的行实际上有足够的分号吗?
  • 输出中的ID CLIENT;email 来自哪里?不能重复,输入文件有21个字段。你不想-f12,21 吗?可能就是这样。也许您的输入中有一些 \r 字符。所以; 在那里,但在0 后面

标签: linux bash shell csv


【解决方案1】:

似乎没有办法让cut 这样做。表达能力的下一步是awk,它很容易做到:

$ cat testfile
one;two;three;four
1;2;3
first;second
only
$ awk -F';' '{ OFS=FS; print $1, $3 }' < testfile
one;three
1;3
first;
only;
$ 

【讨论】:

    【解决方案2】:

    第二行的输出中没有分号,因为第二行仅包含 21 个字段(第一行包含 23 个字段)。 您可以使用以下方法进行检查:

    (cat bigfile.csv | tr -d -c ";\n" ; echo "1234567890123456789012") | cat -n | grep -v -E ";{22}" 
    

    这将输出bigfile.txt 中少于22 个分号的所有行以及相应的行号。

    要解决这个问题,您可以在每行的末尾添加一堆空字段,然后像这样通过管道将结果剪切:

    sed -e's|^\(.*\)|\1;;;;;;;;;;;;;;;;;;;;;;;;|g' bigfile.csv | cut -d ';' -f 12,22 | cut -d ';' -f 12,22 
    

    结果是:

    XXXXXXXXYYY;XXXNNN
    XXXXYYYYXXXXX;
    

    【讨论】:

    • 不,我只想要 12 和 22。
    • 所以用逗号指定。 -f 12,22
    • @EderArmandoAnilloLora:好的,我明白了,你少了一个分号。我更新了我的答案。
    • 感谢您的帮助。我的文件副本是错误的。对不起,我已经修改了帖子。我已经使用了@Henning Makholm 的答案并且它的作品。
    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多