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