Предположим, что файлы не содержат символов табуляции -:
$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE
При этом используется paste
для создания двух столбцов с разделителями табуляцией -с содержимым двух файлов в каждом столбце. Команда awk
сравнивает два столбца в каждой строке и выводит TRUE
, если столбцы совпадают, и в противном случае выводит FALSE
.
Я предполагаю, что
0
, либо 1
.)Это легко сделать с помощью awk
.
... all data that includes "1" under a column header containing "S1", but where all headers containing "S2" have a value of "0" for that same gene.
Другими словами,
awk -v OFS=',' '
NR==1 { next }
($2==1 || $3==1 || $4==1 || $5==1 || $6==1) &&
$7==0 && $8==0 && $9==0 && $10==0 && $11==0 { $1=$1; print }
'
OFS
— «разделитель полей вывода». -v OFS=','
указывает awk
записывать данные с полями, разделенными запятыми -, даже если ввод был разделен табуляцией -или пробелом -. NR==1 { next }
указывает awk
пропустить первую строку (строки заголовка ). Если вы хотите распечатать строку заголовка, измените ее на NR==1 { $1=$1; print; next }
. { $1=$1; print }
печатает строку (, если она удовлетворяет условиям ). $1=$1
означает, что первое поле равно самому себе. Похоже, это почти ничего не делает; по факту,это уловка, чтобы заставить awk
перестроить линию с новым (пользователем -, указанным )разделителем выходных полей (, которое мы указали как запятую ). Если вы когда-нибудь передумаете и хотите вывести строки точно так, как они появляются во входных данных, удалите -v OFS=','
и $1=$1;
. ... only those rows in which there is a "1" value for any REF file (S1 or S2) but only "0"'s for all other fields...
awk -v OFS=',' '
NR==1 { next }
($2==1 || $3==1 || $7==1 || $8==1) &&
$4==0 && $5==0 && $6==0 && $9==0 && $10==0 && $11==0 { $1=$1; print }
'
Where a REF_S1* contains a "1" + where all other (i.e., non-REF) S1 samples are "0" + where all REF_S2* are "0" but where any other S2 samples (non-REF) are "1".
awk -v OFS=',' '
NR==1 { next }
($2==1 || $3==1) && $4==0 && $5==0 && $6==0 &&
$7==0 && $8==0 && ($9==1 || $10==1 || $11==1) { $1=$1; print }
'
... where any *FL is "1", and all *host are "0".
awk -v OFS=',' '
NR==1 { next }
($3==1 || $6==1 || $8==1 || $11==1) &&
$2==0 && $4==0 && $5==0 && $7==0 && $9==0 && $10==0 { $1=$1; print }
'
Эта проблема решается с использованием perl в три шага.
perl -MList::MoreUtils=any,all -lane '
BEGIN {
sub mkAry {
my $re = shift;
grep { $_ }
map { $h{$_} }
grep { /$re/ } keys %h
}
}
if ($. == 1) {
print;
@h{@F} = (0..$#F);
@S1 = mkAry qr/S1/;
@S2 = mkAry qr/S2/;
@REF = mkAry qr/REF/;
@notREF = mkAry qr/^(?!.*REF)/;
@REF_S1 = mkAry qr/REF_S1/;
@REF_S2 = mkAry qr/REF_S2/;
@notREF_S1 = mkAry qr/^(?!.*REF)(?=.*S1)/;
@notREF_S2 = mkAry qr/^(?!.*REF)(?=.*S2)/;
@FL = mkAry qr/FL/;
@host = mkAry qr/host/;
next;
}
##_1_:
print if
any { $_ == 1 } @F[@S1] and
all { $_ == 0 } @F[@S2]
;
##_2_:
print if
any { $_ == 1 } @F[@REF] and
all { $_ == 0 } @F[@notREF]
;
##_3_:
print if
any { $_ == 1 } @F[@REF_S1] and
all { $_ == 0 } @F[@notREF_S1] and
all { $_ == 0 } @F[@REF_S2] and
any { $_ == 1 } @F[@notREF_S2]
;
##_4_:
print if
any { $_ == 1 } @F[@FL] and
all { $_ == 0 } @F[@host]
;
' file | column -t