2017-01-12 3 views
0

Ich verwende folgenden Code, um die Werte zu grep, die die Bedingungen erfüllen, wie unten im Code angegeben. Die zu greppende Zeile sollte entweder den zweiten Spaltenwert -1 in der Datei erfüllen oder 3. Spalte + 1 Wert vorhanden sein.Zeile nicht grepped, auch wenn vorhanden

while read intron ; do 
start=$(grep -w $intron ../file_to_be_grepped_from | awk '{print ($2-1)}') 
end=$(grep -w $intron ../file_to_be_grepped_from | awk '{print ($3+1)}') 
    if (grep $start ../file_to_be_grepped_from | grep -q :E) && (grep $end ../file_to_be_grepped_from | grep -q :E) ; then 
    grep -w $intron ../file_to_be_grepped_from 
    fi 
done < another_file 

Jedoch habe ich die folgende Störung erhalte:

grep: 46844233: No such file or directory 
grep: 46844359: No such file or directory 
grep: 40174126: No such file or directory 
grep: 40174403: No such file or directory 
grep: 40176362: No such file or directory 
grep: 40174671: No such file or directory 
grep: 31542739: No such file or directory 

, aus denen die meisten Werte sind nicht in der Datei vorhanden, mit Ausnahme von 40.174.403 und 40174671. Die Linien, die grep werden soll (und sind vorhanden) aber die nicht aussehen wie folgt:

chr19 40174127 40174403 ENSG00000226025:E4 + 
    chr19 40174671 40174788 ENSG00000226025:E5 + 

Alle Vorschläge zur Korrektur und Verbesserung des Codes wäre willkommen. Mein Eingang sieht ungefähr so ​​aus:

ENSG00000225518:I2 
ENSG00000225535:I1 
ENSG00000225535:I2 
ENSG00000225535:I3 
ENSG00000226025:I4 

und die erwartete Ausgabe ist

chr1 226274755 226277190 ENSG00000225518:I2 + 
chr7 114719164 114758265 ENSG00000225535:I1 + 
chr7 114758880 114758988 ENSG00000225535:I2 + 
chr7 114759111 114762231 ENSG00000225535:I3 + 
chr19 40174404 40174670 ENSG00000226025:I4 + 
+1

Zeigen Sie Eingabe und erwartete Ausgabe, es kann noch einfacher zu erreichen, was Sie wollen. –

+0

Ich bin erstaunt, dass alle Werte vorhanden sind, während Sie "drucken ($ 2-1)" und "drucken ($ 3 + 1)". –

+0

tatsächlich hat es für viele Zeilen funktioniert, ich hoffe, das ist nicht das Problem. – AishwaryaKulkarni

Antwort

2

, erstens, um die grep Fehlermeldungen zu verhindern, können Sie den Code korrigieren, indem die mehrere $var Expansion umgeben von doppelte Anführungszeichen:

while read intron ; do 
    start=$(grep -w "$intron" ../file_to_be_grepped_from | awk '{print ($2-1)}') 
    end=$(grep -w "$intron" ../file_to_be_grepped_from | awk '{print ($3+1)}') 
    if (grep "$start" ../file_to_be_grepped_from | grep -q :E) && 
     (grep "$end" ../file_to_be_grepped_from | grep -q :E) 
    then 
     grep -w "$intron" ../file_to_be_grepped_from 
    fi 
done < another_file 

das erste nicht-Optionsargument des grep-Befehls ist das Muster zu finden. Die nächsten Argumente sind die zu untersuchenden Dateien. Wenn die Variable intron mehrere Werte enthält, durch Leerzeichen getrennt, wie blablabla 46844233 46844359, dann wird grep -w $intron-grep -w blablabla 46844233 46844359 erweitert, wo blablabla das Muster zu finden ist und 46844233 und 46844359 sind Namen von Dateien, die grep werden versuchen, zu öffnen.

Verwandte Themen