2017-02-02 4 views
-1

Ich habe eine Datendatei mit 1000 Zeilen, müssen einige Zeichen aus jeder Zeile ausschneiden: ex-c900-903. Wenn diese extrahierte Zeichenlänge keine Leerzeichen ist, müssen Sie die gesamte Zeile in eine neue Datendatei drucken. Wie kann ich es in Unix-Skript machen?Unix-Datendatei Leseskript

Ich habe versucht, diese

while IFS=read -r line; do 
characters= cut -c900-903 
if [ -n $characters ] 
then 
echo "$line" 
fi 
done < $inputfile > $output file. 
+3

Haben Sie bedeuten, dass, wenn die Zeichen alle Leerzeichen sind, sollten sie entfernt werden? Möchten Sie die gesamte Zeile in die andere Datei oder nur die extrahierten Zeichen drucken? Bitte [Bearbeiten], um mehr zu erklären und uns ein Beispiel Ihrer Eingabe/gewünschten Ausgabe zu zeigen. –

+0

Wollen Sie sagen, dass Sie alle Zeilen mit einer minimalen Länge in eine andere Datei verschieben möchten? Warum verschieben, wenn Sie auch alle Zeilen mit der Länge <10 löschen möchten? –

+0

Müssen ganze Zeile verschieben, wenn die extrahierte Länge des Zeichens keine Leerzeichen sind, habe ich unten Code versucht, während IFS = Read -r-Zeile; Zeichen tun = schneiden -c900-903 if [-n $ Zeichen] dann echo "$ line" fi done <$ Eingabedatei> $ Ausgabedatei. Aber der obige Code funktioniert nicht, es schreibt die extrahierten Zeichen in eine neue Datei. –

Antwort

0

Nach IFS= Sie einen Platz benötigen.
Wenn Sie der Variablen characters einen Wert zuweisen, sollten Sie Leerzeichen vermeiden.
Mit characters="cut -c900-903" werden Sie den Zeichen einen Text zuweisen, nicht das Ergebnis eines Unterbefehls. Verwenden Sie hierzu $(command).
Der Befehl benötigt eine Eingabe zum Schneiden, verwenden Sie echo "${line}".
Leerzeichen sind nicht leer, die -n $characters (was sollte -n "$characters" sein, Fehler zu vermeiden chan die var ist leer) wird glücklich sein, nachdem Räume zu sehen.

while IFS= read -r line; do 
    characters=$(echo "${line}"| cut -c900-903) 
    if [ "${characters}" != " " ] 
    then 
     echo "${line}" 
    fi 
done < $inputfile > $output_file 

Bei großen Dateien wird dies aufgrund der Unterbefehle, die in jeder Schleife geladen werden müssen, sehr langsam. Sie können andere Werkzeuge wie awk, grep oder sed ausprobieren. Hat das für Sie folgende Arbeiten:

grep -vE "^.{899} {4}" ${inputfile} 
+0

Danke ... @Walter. Modifizierter Code hat für mich funktioniert. Aber es dauert etwa 10 Minuten für 50000 Datensätze, ich habe eine Dat-Datei mit etwa 2 Lakhs (0,2 Millionen) von Datensätzen - Größe 700 MB. Ich muss dieses Skript über den Autosys-Job ausführen, der bei Erfolg einen anderen Job auslöst ... Gibt es einen schnelleren Ansatz, um dasselbe Szenario zu machen, um die Datei zu lesen und die gewünschte Ausgabe wie oben zu erhalten? Ich habe versucht Awk, aber, bekam den Fehler, dass Datensatz zu groß ist zu lesen ... (Jeder Datensatz ist von etwa 5000 Zeichen) ... –

+0

Haben Sie versucht, die 'Grep-vE'? Nur von der Kommandozeile, ohne eine Schleife und umleiten Sie die Ausgabe in eine Datei? Oder teste zuerst mit 'head -10 $ {inputfile} | grep .. " –

+0

Mit neueren awk-Versionen (nawk oder besser gawk) hast du keine recordlen-Beschränkung. –