Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 扫描一次文件并从中剪切不同的内容?_Bash_Unix - Fatal编程技术网

Bash 扫描一次文件并从中剪切不同的内容?

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个不同的行计数,而不是全部合并成一个。这是否

我想从文本文件的两列中提取信息。目前,我的代码通过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