2016-05-24 9 views
1

Unten ist die Eingabedatei, die zu diesem Zeitpunkt eine Vorlage ist. Ich möchte verschiedene '-' in jeder Zeile durch tatsächliche Daten aus einem Skript ersetzen.sed in einer while-Schleife

030 230 - - - - - - - 
230 330 - - NA NA - - - 
330 430 - - NA NA - - - 
430 530 - - - - - - - 
530 630 - - NA NA - - - 
630 2400 - - - - - - - 

Ich mag das Skript auszuführen und aktualisieren (in der gleichen Datei) eine Zeile zu einem Zeitpunkt, basierend auf den Bedingungen im Skript. Die aufeinanderfolgenden Ausführungen des Skripts würden andere Zeilen der Datei aktualisieren. Unten ist das Skript.

##Time=`echo $(date) | awk -F ' ' '{print $4}' | awk -F ':' '{print $1$2}'` 
Time=0330; 

     while read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 
     do 
       if (("${Time}" >= "${f1}" && "${Time}" < "${f2}")) 
       then 
        sed "s/$f3/R/;s/$f4/F/;s/$f5/G/;s/$f6/H/;s/$f7/K/" 
        else 
        echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9         
       fi 
     done < consolidated.txt 

Erwartete Ausgabe ist unter.

030 230 - - - - - - - 
230 330 - - NA NA - - - 
330 430 R F NA NA G H K 
430 530 - - - - - - - 
530 630 - - NA NA - - - 
630 730 - - - - - - - 

gelten dann das Skript mit Time = 0600 auf der oben genannten Datei ausgeben so etwas wie dieses

030 230 - - - - - - - 
230 330 - - NA NA - - - 
330 430 R F NA NA G H K 
430 530 - - - - - - - 
530 630 A B NA NA D E F 
630 730 - - - - - - - 

aber nach dem Skript mit Zeit läuft = 0330 (erster Lauf) gibt es unten ausgegeben.

030 230 - - - - - - - 
230 330 - - NA NA - - - 
430 530 R F G H K - - 
530 630 R F NA NA G H K 
630 730 R F G H K - - 

Auch diese Änderungen sind in der Stdout und nicht in der Datei vorgenommen. Ich habe versucht, die sed-Flag -i zu verwenden, die keine anerkannte Flagge auf meinem System ist.

Ich denke, es muss Variation in der Art und Weise sein, in der sed verwendet wird, aber nicht sicher, was.

+0

Ich habe meine Antwort erheblich geändert. Im Allgemeinen ist es besser, die einfachste verfügbare Option zu verwenden, in diesem Fall ein einfaches "Echo". Wenn Sie die Daten in derselben Datei aufbewahren müssen, ist es besser, wenn ein Skript die Verarbeitung durchführt und eine, die eine temporäre Datei generiert und dann die Datei überschreibt. z.B. 'konsolidiert.txt | ./script.sh> /tmp/tmp_consolidated.txt && mv /tmp/tmp_consolidated.txt konsolidiert.txt'.Auf diese Weise bleibt die Originaldatei erhalten, wenn irgendwo im Skript etwas schief geht (nicht nur innerhalb des if). – grochmal

Antwort

0

sed -i existiert nur in GNU sed. AIX verwendet das gemeinsame POSIX sed. Sie müssen entweder eine andere Datei ausgeben und dann die ursprüngliche überschreiben oder GNU sed installieren.

Ich würde vorschlagen, GNU sed zu installieren, hatte nie Probleme beim Kompilieren von der Quelle auf AIX.


Um fair zu sein, ich habe keine Ahnung, warum Sie sed hier

if (("${Time}" >= "${f1}" && "${Time}" < "${f2}")) 
then 
    sed "s/$f3/R/;s/$f4/F/;s/$f5/G/;s/$f6/H/;s/$f7/K/" 
else 
    echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 f9 
fi 

Sie gelesen haben alle Leerzeichen getrennte Teile als Variablen daher können Sie sie verwenden ziemlich viel Echo

if (("${Time}" >= "${f1}" && "${Time}" < "${f2}")) 
then 
    echo $f1 $f2 R F G H K $f8 $f9 
else 
    echo $f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 f9 
fi 
aus

Auch würde ich töten

< consolidated.txt 

aus dem Skript. Stattdessen ich das Skript mit Eingang und Ausgang jedes Mal nennen würde, das eine gewisse Freiheit gibt, wie Sie es nennen:

cat consolidated.txt | ./script.sh > consolidated_result.txt 

./script <consolidated.txt >consolidated_result.txt 

cat consolidated.txt | ./script.sh | ./further_processing.sh 

(das wäre die * nix-Art, die Dinge sein)

+0

Nun, ich dachte mir, dass ich das unten als Alternative zur Option -i tun kann, die ich nicht habe. 'sed" s/$ f3/R /; s/$ f4/F /; s/$ f7/G /; s/$ f8/H /; s/$ f9/K/"konsolidiert.txt> konsolidiert.txt .tmp && mv konsolidiert.txt.tmp konsolidiert.txt'. Aber das ist nur die Spitze meines Problems. Sie sehen die Ausgabe von sed, wenn sie in der while-Schleife ausgeführt wird. Das ist der eigentliche Fehler. Es ersetzt den Wert in allen Zeilen, der nicht gewünscht ist. – user3055262

1

Führender 0 bedeutet hexadezimal, um eine Zahl als Dezimalwert zu interpretieren. 10 # n

if (("10#${Time}" >= "10#${f1}" && "10#${Time}" < "10#${f2}"))