如果所有值都更高,则打印

时间:2013-04-26 07:19:23

标签: r awk

我有一个类似的文件:

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}}'

2 个答案:

答案 0 :(得分:2)

我希望你的意思是你在问题中添加了标记。

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

这会将您的文件读取为以空格分隔的表格,将第二列拆分为单独的值(生成字符向量列表),然后根据所有值是否为&gt来计算每个此类行的逻辑值; 50.这些结果与逻辑向量组合,然后用于对数据进行子集化。

答案 1 :(得分: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

说明

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