2013-04-26 48 views
1

我有这样一个文件:打印如果所有值都较高

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2 
B 37.40,37.40,38.40,38.80,58.40,58.80,45.00,44.8 
. 
. 
. 

我想打印那些在列2中的所有值都超过50

输出线:

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2 

我试过了:

cat file | tr ',' '\t' | awk '{for (i=2; i<=NF; i++){if($i<50) continue; else print $i}}' 
+0

你在SO上搜索了子集矩阵或data.frames吗? – Arun 2013-04-26 07:22:24

回答

2

我希望你的意思是说标签你添加到您的问题。

tab <- read.table("file") 
splt <- strsplit(as.character(tab[[2]]), ",") 
rows <- unlist(lapply(splt, function(a) all(as.numeric(a) > 50))) 
tab[rows,] 

这将读取您的文件作为一个空格分开的表,分割第二列到单个值(导致字符向量的列表),然后根据计算每个这样的行的逻辑值是否所有的值都大于50.这些结果被合并为一个逻辑向量,然后用它来对数据进行子集化。

2

字段分隔符可以是任何正则表达式,所以如果您在FS逗号你的方法的工作原理:

awk '{ for(i=2; i<=NF; i++) if($i<=50) next } 1' FS='[ \t,]+' infile 

输出:

A 50.40,60.80,56.60,67.80,51.20,78.40,63.80,64.2 

说明

的换循环遍历第二列中逗号分隔的值,如果其中任何一个小于或等于50执行,即跳到下一行。如果第一个块被传递,则遇到1,其值为true并执行默认块:{ print $0 }