我有一个类似的文件:
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 :(得分:2)
我希望你的意思是你在问题中添加了r标记。
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 }
。