2016-04-25 8 views
-1

Ich erstelle ein Bash-Skript, um Informationen mit grep und sed zu ändern und zusammenzufassen. Aber es bleibt stecken.Bash-Skript zum Ändern und Extrahieren von Informationen

#!/bin/bash 

# This script extracts some basic information 
# from text files and prints it to screen. 
# 
# Usage: ./myscript.sh </path/to/text-file> 


#Extract lines starting with ">@HWI" 

    ONLY=`grep -v ^\>@HWI` 

#replaces A and G with R in lines 

    ONLYR=`sed -e s/A/R/g -e s/G/R/g $ONLY` 

    grep R $ONLYR | wc -l 
+4

Sie sagen 'grep pattern', aber stellen Sie keine Datei oder Zeichenfolge zur Verfügung, mit der sie übereinstimmen. – fedorqui

+0

Dies ist ein [XY-Problem] (http://xyproblem.info/). Die Shell ist eine Umgebung, in der Tools mit einer Sprache aufgerufen werden können, um diese Aufrufe zu sequenzieren. Was Sie tun, ist die Manipulation von Text. Das UNIX-Werkzeug zum Manipulieren von Text ist awk. Anstelle eines Shell-Skripts, das Aufrufe von grep und sed umschließt, sollten Sie nur ein einfaches awk-Skript verwenden. Wenn Sie eine übersichtliche, testbare Beispieleingabe und eine erwartete Ausgabe veröffentlichen, können wir Ihnen helfen, alles zu tun, was Sie brauchen, um den richtigen Weg zu finden. –

Antwort

0

Zu allererst und als @fedorqui kommentiert - Sie sind nicht grep mit einer Quelle von Eingangsbereitstellt, gegen die es wird Leitungsanpassung durchzuführen.

Zweitens gibt es einige Probleme in Ihrem Skript, das unerwünschte Verhalten in der Zukunft führen wird, wenn Sie sich entscheiden, einige Daten zu manipulieren:

  • Shop Anpassungsleitungen in einem Array oder ein Datei, von der Sie später Werte lesen werden. Die Variable ONLY ist nicht die richtige Datenstruktur für die Aufgabe.
  • Vereinbarungsumgebungsvariablen (PATH, EDITOR, SHELL, ...) und innere Schale Variablen (BASH_VERSION, RANDOM, ...) ist voll aktiviert. Alle anderen Variablennamen sollten Kleinbuchstaben sein. Da Variablennamen zwischen Groß- und Kleinschreibung unterscheiden, verhindert diese Konvention das versehentliche Überschreiben von Umgebungs- und internen Variablen.

Hier ist eine bessere Version des Skripts, diese Punkte unter Berücksichtigung, aber mit einer offenen Frage, was Sie in der letzten Zeile vorhatten: grep R $ONLYR | wc -l:

#!/bin/bash 

# This script extracts some basic information 
# from text files and prints it to screen. 
# 
# Usage: ./myscript.sh </path/to/text-file> 

input_file=$1 

# Read lines not matching the provided regex, from $input_file 
mapfile -t only < <(grep -v '^\>@HWI' "$input_file") 

#replaces A and G with R in lines 
for((i=0;i<${#only[@]};i++)); do 
    only[i]="${only[i]//[AG]/R}" 
done 

# DEBUG 
printf '%s\n' "Here are the lines, after relpace:" 
printf '%s\n' "${only[@]}" 

# I'm not sure what you were trying to do here. Am I gueesing right that you wanted 
# to count the number of R's in ALL lines ? 
# grep R $ONLYR | wc -l 
1

Der richtige Weg ein schreiben Shell-Skript zu tun, was Sie zu tun scheinen zu versuchen, ist:

awk ' 
    !/^>@HWI/ { 
     gsub(/[AG]/,"R") 
     if (/R/) { 
      ++cnt 
     } 
    END { print cnt+0 } 
' "[email protected]" 

Nur, dass myscript.sh in der Datei setzen und ausführen, wie Sie es heute tun.

Um klar zu sein - der Großteil des obigen Codes ist ein awk-Skript, der Shell-Skript Teil ist die erste und letzte Zeile, wo die Shell nur awk anruft und übergibt die Eingabe Dateinamen.

Wenn Sie dann Zwischenvariablen haben wollen können Sie erstellen/drucken Sie sie mit:

awk ' 
    !/^>@HWI/ { 
     only = $0 
     onlyR = only 
     gsub(/[AG]/,"R",onlyR) 
     print "only:", only 
     print "onlyR:", onlyR 
     if (/R/) { 
      ++cnt 
     } 
    END { print cnt+0 } 
' "[email protected]" 

robust portably, Das wird oben arbeiten und effizient auf allen UNIX-Systemen.

Verwandte Themen