#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: Я. Я проверял данные, которые он вставил, поэтому должен сделать их согласованными, спасибо.