Bash 扫描一次文件并从中剪切不同的内容?
我想从文本文件的两列中提取信息。目前,我的代码通过3种不同的扫描来提取此信息:Bash 扫描一次文件并从中剪切不同的内容?,bash,unix,Bash,Unix,我想从文本文件的两列中提取信息。目前,我的代码通过3种不同的扫描来提取此信息: cut -d',' -f 8 file1.csv | sort -g | uniq -c | wc -l cut -d',' -f 9 file1.csv | sort -g | uniq -c | wc -l cut -d',' -f8,9 file1.csv | sort -g | uniq -c | wc -l 我想做这一切扫描文件只有一次。我还忘了补充,我想得到3个不同的行计数,而不是全部合并成一个。这是否
cut -d',' -f 8 file1.csv | sort -g | uniq -c | wc -l
cut -d',' -f 9 file1.csv | sort -g | uniq -c | wc -l
cut -d',' -f8,9 file1.csv | sort -g | uniq -c | wc -l
我想做这一切扫描文件只有一次。我还忘了补充,我想得到3个不同的行计数,而不是全部合并成一个。这是否可以在不编写复杂程序的情况下实现
感谢您的帮助
Ted.我会使用
awk
或perl
(可以使用Python或Ruby)对cut的最后一个变体进行后期处理:
cut -d',' -f8,9 file1.csv |
awk -F, '{ field8[$1] = 1; field9[$2] = 1; field89[$1,$2] = 1; }
END {
i=0; for (j in field8) { i++; }; print i;
i=0; for (j in field9) { i++; }; print i;
i=0; for (j in field89) { i++; }; print i;
}'
或者,简化,因为awk
可以拆分字段:
awk -F, '{ field8[$8] = 1; field9[$9] = 1; field89[$8,$9] = 1; }
END {
i=0; for (j in field8) { i++; }; print i;
i=0; for (j in field9) { i++; }; print i;
i=0; for (j in field89) { i++; }; print i;
}' file1.csv
由于该问题假设数据字段等中嵌入逗号不会出现复杂问题,因此该答案也忽略了这些问题。不过,请注意,CSV文件通常过于复杂,无法使用诸如cut
(甚至awk
)之类的简单工具进行处理。Perl有适当处理CSV的模块;其他可扩展脚本语言也是如此。您希望输出什么?三行,每行包含一个数字。这就是示例代码产生的结果。您所说的这些模块是否与使用cut和awk一样快?是的,如果只是因为它们不需要管道在进程之间传递cut信息的话。Text::CSV_XS模块(使用C代码来支持CSV,而不是使用纯Perl)本身将与awk
一样快(并且可能更快),当CSV数据中有嵌入逗号的字段时,其额外的好处是正确。
awk -F, '{ field8[$8] = 1; field9[$9] = 1; field89[$8,$9] = 1; }
END {
i=0; for (j in field8) { i++; }; print i;
i=0; for (j in field9) { i++; }; print i;
i=0; for (j in field89) { i++; }; print i;
}' file1.csv