2013-04-26 2 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

ответ

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 next, то есть переход к следующей строке. Если первый блок передан, встречается 1, который оценивает значение true и выполняет блок по умолчанию: { print $0 }.

Смежные вопросы