2017-01-17 2 views
0

Ich habe Datei, die mehrere Spaltenreihen haben, die nach Anforderung behandelt werden müssen. Ich fand ein Skript, das diese mit Variablen der Fall ist, aber ich möchte dies mit Variablen, die nicht tun, da dies mein Code komplexer machtsed Befehl zum Bearbeiten einer Datei unter mehreren Bedingungen

Datei:

Id,Name,class,Section 
1,Dileep,MBA,B 
2,Pavan,tenth,C 
3,Girish,graduate,D 

Meine Ausgabedatei sollte wie folgt sein -

Datei:

Id,Name,Class,Section 
1,Dileep,MBA,B 
2,Pavan,MCA,C 
3,Girish,MBA,D 

ich sed Befehl verwendet haben, dies zu tun und unten ist das Skript, das ich für diese erstellt.

#! /bin/sh 
file=/tmp/dileep/details.txt 

cat $file | sed '/Id,Name,/s/class/**C**lass/g' | tee -a $file 
cat $file | sed '/2,Pavan,/s/tenth/**MCA**/g' | tee -a $file 
cat $file | sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a $file 

Ich bin in der Lage, die erste Linie zu bekommen veränderten den mit Kopf, aber nicht die eigentlichen Daten, das wird hart codierte Daten sein, und ich kann diese Änderung vornehmen.

Können Sie mir bitte sagen, was ich falsch mache und wie ich das korrigieren kann.

+1

Sie vermeiden nicht 'tee' wie diese verwenden können. Sobald die Eingabedatei größer als die von 'tee' verwendete Puffergröße ist, verlieren Sie Ihre Eingabedatei. – hek2mgl

+1

willst du nur 'zehnte' durch' MCA' ersetzen, wenn die Zeile mit '2, Pavan' beginnt? Oder warum machst du '/ 2, Pavan,/s/zehnte/** MCA **/g' und nicht nur' s/zehnte/** MCA **/g'? – hansaplast

+0

Ich würde gerne auf die Bedingung überprüfen, wenn 2, Pavan dann zu MCA ändern, wenn Klasse Zehntel ist, ähnlich für die anderen, muss ich überprüfen, ob der erforderliche Inhalt gefunden wird, dann muss ich es auf den gewünschten Wert ändern – Dileep

Antwort

1

erste (!)

Sie können nicht T-Shirt wie folgt verwenden. Sobald die Eingabedatei größer als die vom Tee verwendete Puffergröße ist, geben Sie Ihre Ihre Eingabedatei frei.


Über das Thema, meinst du sowas?

würde ich awk verwenden:

sanitize.awk:

BEGIN { 
    FS=OFS="," 
} 

$3=="class" { 
    $3="Class" 
} 

$3=="tenth"{ 
    $3="MCA" 
} 

$3=="graduate" { 
    $3="MBA" 
} 

{ 
    print 
} 

Run es mögen:

awk -f sanitize.awk input.file > output.file 
mv output.file > input.file 
+0

verweisen meine Antwort, improvisiert ein wenig, um die tatsächlichen Bedingungen in OP verwendet zu verwenden. wird gerne entfernt, wenn Sie diese Bedingungen hinzufügen können. – Inian

+0

Ich habe das Gefühl, dass diese Überprüfungen das sind, was das OP nicht will. Sonst macht die Frage keinen Sinn für mich. – hek2mgl

+0

Ja sogar ich war mir nicht sicher. Aber seine Absicht mit "sed" veranlasste mich, eine solche Logik zu liefern. – Inian

0

Sie sed auf unterschiedliche Weise nutzen können. Ich werde zuerst das Skript reparieren

file=/tmp/dileep/details.txt 
output=/tmp/dileep/details.out 
# Off-topic: cat $file | sed '...' can be replaced by sed '...' $file 
cat $file | sed '/Id,Name,/s/class/**C**lass/g' | 
      sed '/2,Pavan,/s/tenth/**MCA**/g' | 
      sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

Mit sed Sie die Option -e verwenden können:

file=/tmp/dileep/details.txt 
output=/tmp/dileep/details.out 
# No spaces after the last '\' of the line! 
cat $file | sed -e '/Id,Name,/s/class/**C**lass/g' \ 
       -e '/2,Pavan,/s/tenth/**MCA**/g' \ 
       -e '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

Oder können Sie ein langer Befehl (sieht schrecklich):

cat $file | sed -e \ 
    '/Id,Name,/s/class/**C**lass/g;/2,Pavan,/s/tenth/**MCA**/g;/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

Was Sie brauche hier eine Befehlsdatei:

cat /tmp/dileep/commands.sed 
/Id,Name,/s/class/**C**lass/g 
/2,Pavan,/s/tenth/**MCA**/g 
/3,Girish,/s/graduate/**MBA**/g 

Und

cat $file | sed -f /tmp/dileep/commands.sed | tee -a ${output} 

oder besser verwenden, die cat

sed -f /tmp/dileep/commands.sed ${file} | tee -a ${output}