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

2 回答 2

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 }

于 2013-04-26T09:30:32.950 回答
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 为每个此类行计算一个逻辑值。这些结果被组合成一个逻辑向量,然后用于对数据进行子集化。

于 2013-04-26T07:42:41.810 回答