awk sed if-Anweisung

awk sed if-Anweisung

Ich versuche, am Anfang eine 0 hinzuzufügen, WENN beim zweiten Zeichen dieser Zeile ein "." steht. Ich konnte diese beiden nicht kombinieren;

awk '{ print substr( $0, 2, 1 ) }' file.txt 

zeigt das zweite Zeichen

sed -ie "s/.\{0\}/0/" file.txt

durch Hinzufügen einer Null am Anfang.

Es sollte ein „wenn das zweite Zeichen ein Punkt ist“ geben.

Beispieldatei:

1.02.2017 23:40:00
10.02.2017 23:40:00

Finale:

01.02.2017 23:40:00
10.02.2017 23:40:00

Antwort1

Wir können entweder sedoder verwenden awk, um das Problem vollständig zu lösen.


Mit sed:

$ sed 's/^.\./0&/' file.txt

Wenn &im Ersetzungsteil des Ersetzungsbefehls ( s) vorkommt, wird es auf den Teil der Eingabezeile erweitert, der mit dem Musterteil des Befehls übereinstimmt.

Der reguläre Ausdruck ^.\.bedeutet "passt zu allen Zeilen, die mit ( ^) einem beliebigen Zeichen ( .) beginnen, gefolgt von einem Punkt ( \.)".

Wenn die Zeile ist 1.02.2017 23:40:00, stimmt das Muster überein und 1.wird 01.am Anfang der Zeile durch ersetzt.


Mit awk:

Aufbauend auf dem Teilcode awkin der Frage ...

Dadurch wird, wie angegeben, das zweite Zeichen jeder Eingabezeile gedruckt:

$ awk '{ print substr($0, 2, 1) }' file.txt

Wir können die Tatsache, dass substr($0, 2, 1)das zweite Zeichen zurückgegeben wird, als Bedingung verwenden:

$ awk 'substr($0, 2, 1) == "." { ... }' file.txt

Es handelt sich { ... }um Code $0, der dem Inhalt der aktuellen Zeile eine Null voranstellt, wenn die vorhergehende Bedingung erfüllt ist:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt

Dann müssen wir nur noch sicherstellen, dass alle Zeilen gedruckt werden:

$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt

Die Bedingung substr($0, 2, 1) == "."kann natürlich auch in einen regulären Ausdruck geändert werden (wir verwenden genau denselben Ausdruck, den wir in der sedLösung verwendet haben):

$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt

Manche Leute, die denken "kürzer ist immer besser", würden das so schreiben:

$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt

(und wahrscheinlich auch die meisten Leerzeichen entfernen: awk '/^.\./{$0="0"$0}1' file.txt)

Antwort2

Mit sed:

sed -e "/^.\./s/^/0/" file.txt 

Das Muster /^.\./sucht am Zeilenanfang nach einem beliebigen Zeichen und einem wörtlichen Punkt ^und ersetzt, wenn dies übereinstimmt, sdiesen Zeilenanfang durch eine Null, wodurch die Null effektiv an den Anfang angehängt wird.

Der sed-Ausdruck s/.\{0\}/0/ist etwas seltsam, er gleicht null oder mehr Kopien von irgendetwas ab und ersetzt sie durch eine Null. Das Muster wird natürlich an jeder Stelle der Zeichenfolge übereinstimmen, aber da s///nur die erste Übereinstimmung ersetzt wird, funktioniert es wie beabsichtigt. Trotzdem eine kuriosere Art, es zu tun.


Oder mit awk würde ein ähnlicher regulärer Ausdruck funktionieren, um die Zeile abzugleichen, aber wir können Folgendes verwenden substr:

awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 

Wir testen zunächst, ob das zweite Zeichen ein Punkt ist, und fügen dann in diesem Fall eine Null an den Zeilenanfang hinzu. Der letzte Schritt ruft die Standardaktion auf, die Zeile nach allen Änderungen auszudrucken.

Antwort3

Sie sagten awk und sed, aber es scheint, als würden Sie versuchen, ein Datum zu formatieren, und dafür würde ich den dateBefehl verwenden. Zum Beispiel:

echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d

wird ausgeben

01.02.2017 23:40:00

Der sedBefehl in der Mitte ändert die Punkte in Schrägstriche für die Eingabe in date -d. Die Formatoptionen ermöglichen die Ausgabe in nahezu jedem gewünschten Format. %mInsbesondere wird der Monat mit Nullen aufgefüllt, was Sie anscheinend auch versuchen.

Kusalananda weist darauf hin:

Noch kompakter (GNU Date und Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'

Antwort4

Mit sed könnte es sein

sed 's/^\(.\)\.\(.*\)/0\1.\2/'

Dies wird verwendet ^, um am Anfang der Zeile zu verankern und dann ein beliebiges einzelnes Zeichen in einer Gruppe zu erfassen, gefolgt von einem Literal und .dann irgendetwas anderem. Wenn wir das abgleichen, drucken wir ein 0, dann unsere erste Erfassungsgruppe (das Zeichen am Anfang der Zeile), dann ein und .dann unsere zweite Erfassungsgruppe (den Rest der Zeile).

verwandte Informationen