2013-04-26 54 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 }