命令“剪切”不显示最后一列CSV

时间:2019-08-02 17:11:25

标签: linux bash shell csv

我已经从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,并且这些列存在。

2 个答案:

答案 0 :(得分: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;
$ 

答案 1 :(得分:1)

第二行的输出中没有分号,因为第二行仅包含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;