Извлечение строк из таблицы, где значения меньше и больше, чем в столбцах в оболочке

#bash #shell #unix #awk

#bash #оболочка #unix #awk

Вопрос:

У меня есть очень большая таблица с разделением на вкладки (размером 24 ГБ) со C1 столбцами и C2 , C3 и C4 , как показано ниже. Я хотел бы извлечь строки с C1 <0,6 и C2 <0,4. Как мне это сделать в unix / shell с использованием логических операторов?

 C1     C2    C3     C4
0.8    0.1   A1     C.a 
0.2    0.3   A2     C.b
0.5    0.8   A3     C.c
0.1    0.1   A4     C.c
  

Результат, который я ожидаю:

 C1     C2    C3     C4
0.2    0.3   A2     C.b
0.1    0.1   A4     C.c
  

Комментарии:

1. Не могли бы вы сообщить мне, помог ли вам мой ответ здесь?

Ответ №1:

1-е решение: это простое awk решение должно выполнить эту работу за вас.

 awk 'FNR==1 || ($1<.6 amp;amp; $2<.4)' Input_file
  

ИЛИ для Input_file, разделенного табуляцией, попробуйте выполнить следующее:

 awk 'BEGIN{FS=OFS="t"}FNR==1 || ($1<.6 amp;amp; $2<.4)' Input_file
  


2-е решение (общее): если вы не хотите жестко указывать номер поля поля c1 c2 и хотите получить его программно, попробуйте выполнить следующее. Добавьте BEGIN{FS=OFS="t"} следующее, если ваш Input_file разделен табуляцией.

 awk -v c1Thre="0.6" -v c2Thre="0.4" '
FNR==1{
  for(i=1;i<=NF;i  ){
    if($i=="C1"){ C1Field=i }
    if($i=="C2"){ C2Field=i }
  }
  print
  next
}
$C1Field<c1Thre amp;amp; $C2Field<c2Thre
'  Input_file
  

Комментарии:

1. Бит короче: awk -F 't' 'NR==1 || ($1<.6 amp;amp; $2<.4)' file

2. @anubhava, спасибо, сэр, отредактировал решение сейчас, сохранив 2 решения: 1, когда Input_file НЕ t разделен, и другое, когда Input_file разделен табуляцией.

Ответ №2:

попробуйте следующее: я удалил пробелы (есть 3/4 пробела) и изменил их на «,» для обработки :

 cat mydata.txt | tr -s " " "," | awk -F"," 'BEGIN { X = NF } { for (i = 0; i <= X; i = i   1) if($1 < 0.6 amp;amp; $2<0.4) print $0}'
  

Комментарии:

1. @JamesBrown: Я. Я проверял данные, которые он вставил, поэтому должен сделать их согласованными, спасибо.