2017-12-11 5 views
1

Ich möchte einen Unix-Befehl wie sed oder awk verwenden, um die Zeichenfolge "#DONE" an das Ende der ersten Zeile in einer Textdatei anzuhängen, die nicht bereits die Zeichenfolge "#DONE" enthält.Text an die erste Zeile anhängen, die kein Muster enthält?

Zum Beispiel würde die Eingabedatei so etwas wie

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh 
qsub job4.sh 

sein und die gewünschte Ausgabe

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh #DONE 
qsub job4.sh 

erlebe ich bin nicht mit dieser Art von Scripting, und ich habe gesucht, aber kann sein würde, Finde die genaue Lösung dafür auf SO nicht.

Antwort

3

Awk Ansatz:

awk '!f && !/#DONE$/{ $0=$0 "#DONE"; f=1 }1' file 

Der Ausgang:

qsub job1.sh #DONE 
qsub job2.sh #DONE 
qsub job3.sh #DONE 
qsub job4.sh 
+1

Ok deine ist viel besser :-) aber das '" #DONE ";' sollte '" #DONE "sein;' Ich denke und die Datei muss aktualisiert werden>> tmp && mv tmp "file" 'oder so – Ivonet

0

Rohr aproach wo file ist Ihre Datei (zweimal)

grep -nrv -m1 "#DONE" "file" | awk -F ":" '{print $2}' | xargs -I {} awk 'FNR=={},FNR=={}{$3="#DONE"};1' "$1" >tmp && mv tmp "file" 

Dies wird so lange arbeiten, wie Du bist nicht komplett #DO NE.

Wenn das der Datei :-)

geleert werden happends nicht, dass man herausgefunden noch

2

Dies könnte für Sie arbeiten (GNU sed):

sed '/#DONE$/!{s/$/#DONE/;:a;n;ba}' file 

Anfügen #DONE in der ersten Zeile, die es nicht hat, dann drucken Sie den Rest der Datei.

2

andere awk

awk -v k="#DONE" '$NF!=k && !c++{$++NF=k}1' file 

!c++ wird sicherzustellen, dass es nur einmal durchgeführt werden, $++NF=k erhöht die Anzahl der Felder und setzt das letzte Feld auf den Wert.

Verwandte Themen