93578
Goto Top

Alle Strings vor "-" durch Hash-Wert (SHA1) zu ersetzen

Hallo an alle,

ich habe folgendes Problem:

Eine txt-Datei sieht so aus:

aa-1
bbbbbbbbbb-12
cccccccccccccccccc-123
ddd_ddd-1234
eeeeeee-12345
ffffff-123456
ggggg.ggggg-1234567

Wie kann man alle Wörter in allen Zeilen, die vor "-" stehen in ein SHA1-Hash umwandeln?

Endergebnis soll etwa so aussehen:

e0c9035898dd52fc65c41454cec9c4d2611bfb37-1
45dfb79d668374f6578b3128746dce59b7a02e80-12
3990cdbab32e246d507b4297c361267a1713c9f2-123
5b567480718b3aab32c5295786d9949736ab19b4-1234
d6004a0f8fbb84595534a0f8323613b681917597-12345
c81019207890deb5cba8cda1de0dd6b1c229eeff-123456
8b1d3478a656980da1111f7cee36a2866ffa3c99-1234567

Kann mir da jemand von Euch helfen?

Gruß,
Takitano

Content-Key: 390108

Url: https://administrator.de/contentid/390108

Printed on: April 25, 2024 at 13:04 o'clock

Mitglied: 93578
93578 Oct 19, 2018 updated at 11:12:17 (UTC)
Goto Top
Evtl. wichtig:
1) "-" kommt in diesen Wörtern (die umgewandelt werden sollen) nicht vor. Also kann man "-" als eindeutiiges Merkmal/Trennzeichen nutzen.
2) alle Wörter vor "-" bestehen nur aus ASCII-Zeichen
Mitglied: 93578
93578 Oct 19, 2018 updated at 11:40:25 (UTC)
Goto Top
Ok. Zuerst kann ich alle Wörter vor "-" extrahieren.

cut -d- -f1 datei.txt > spalte1.txt

Das ist klar. Nun habe ich eine komplette Datei, wo jede Zeile in ein SHA1-Hash ungewandelt soll.

Aber wie? Für einzelnen Wort ist kein Problem mit sha1sum. Aber für mehrere?

Und wie kann ich danach die Dateien wieder zusammen "kleben"?
Mitglied: 93578
93578 Oct 19, 2018 updated at 12:02:11 (UTC)
Goto Top
Ok.
Das geht schon in die richtige Richtung:

cut -d- -f1 test.txt > spalte1.txt
while read line
do
/bin/echo -n "$line" | sha1sum >> hashes.txt  
done < spalte1.txt

Aber wie kann ich nun die beide Dateien: hashes.txt und test.txt zusammenfügen und Wörter for "-" durch Hashes aus hashes.txt ersetzen?
Member: Kraemer
Kraemer Oct 19, 2018 at 12:49:39 (UTC)
Goto Top
Powershell
$Sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
$Enc = [system.Text.Encoding]::UTF8
$Lines=Get-Content C:\temp\Input.txt
$Lines | %{
    $_ -match "(^.*)(-\d*)" | Out-Null  
    $Data=$Enc.GetBytes($matches[1])
    $Hash=$Sha.ComputeHash($Data)
    $Hash=[System.BitConverter]::ToString($Hash) -replace "-",""  
    $New=$Hash+$matches[2]
    write-host $New

}
Member: Lochkartenstanzer
Lochkartenstanzer Oct 19, 2018, updated at Oct 21, 2018 at 12:23:02 (UTC)
Goto Top
Moin,

Quick-'n-Dirty-Lösung:
Der Einzeiler
lks@nana:~$  echo -n "aa-1 
bbbbbbbbbb-12 
cccccccccccccccccc-123 
ddd_ddd-1234 
eeeeeee-12345 
ffffff-123456 
ggggg.ggggg-1234567" |  gawk -F "-" ' { print system("echo -n " $1 " | sha1sum - ; echo -n " $2)  } ' | sed -e  ':a;N;$!ba;s/ *-\n/-/g' | sed -e "s:0$::g"
ergibt als Ausgabe:
e0c9035898dd52fc65c41454cec9c4d2611bfb37-1
45dfb79d668374f6578b3128746dce59b7a02e80-12
3990cdbab32e246d507b4297c361267a1713c9f2-123
33fe852449b2dd83f7ed54168239655a54de04f9-1234
d6004a0f8fbb84595534a0f8323613b681917597-12345
c81019207890deb5cba8cda1de0dd6b1c229eeff-123456
8b1d3478a656980da1111f7cee36a2866ffa3c99-1234567

lks
Mitglied: 93578
93578 Oct 22, 2018 updated at 09:22:45 (UTC)
Goto Top
Zuerts: vielen Dank an alle Helfer!

Es sieht zwar gut aus, aber...

1) Powershell kommt da leider nicht in Frage. Sorry, Kraemer!

2) Lochkartenstanzer, deine Lösung sieht fast perfekt aus, aber...

Wenn ich solche Zeilen habe:

abcdefgh-12345-12345
afwffwgegeb-1234567-123456-12345

wird das Ergebnis so dargestellt:

SHA1-12345
SHA1-1234567

Die restlichen Symbole werden also abgeschnitten. Ich brauche aber alle Symbole nach dem ersten "-". Kann man da was machen? Danke trotzdem!
Member: Lochkartenstanzer
Lochkartenstanzer Oct 22, 2018 at 09:34:24 (UTC)
Goto Top
Zitat von @93578:

2) Lochkartenstanzer, deine Lösung sieht fast perfekt aus, aber...

Wenn ich solche Zeilen habe:

abcdefgh-12345-12345
> afwffwgegeb-1234567-123456-12345

wird das Ergebnis so dargestellt:

SHA1-12345
> SHA1-1234567

Dann spezifieziere korrekt und paß die quick'n-Dirty-Lösung Deinen Bedürfnissen an. Die Werkzeuge (awk, sed, echo, pipe) hast Du ja.

Die restlichen Symbole werden also abgeschnitten. Ich brauche aber alle Symbole nach dem ersten "-". Kann man da was machen?

Ja. paß das awk-Statement an.

lks
Mitglied: 93578
93578 Oct 22, 2018 at 09:52:36 (UTC)
Goto Top
Leider bin ich im Linux eine Niete...

Mit "sha1sum - ; echo -n " $0) " bekomme ich:

SHA1-abcdefgh-12345-12345.

Im Internet finde ich nichts dazu.
Member: Lochkartenstanzer
Lochkartenstanzer Oct 22, 2018 updated at 10:05:27 (UTC)
Goto Top
Zitat von @93578:

Leider bin ich im Linux eine Niete...

Mit "sha1sum - ; echo -n " $0) " bekomme ich:

SHA1-abcdefgh-12345-12345.

Im Internet finde ich nichts dazu.

http://www.grymoire.com/Unix/Sed.html
https://www.gnu.org/software/gawk/manual/gawk.html

http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_014_000. ...
http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_015_000. ...

lks

PS. Ich schau mal nachher, wenn ich Luft habe, was sich da machen läßt.

PPS: Spezifizier mal das genaue Eingabeformat! Denn

Evtl. wichtig:
1) "-" kommt in diesen Wörtern (die umgewandelt werden sollen) nicht vor. Also kann man "-" als eindeutiiges Merkmal/Trennzeichen nutzen.
2) alle Wörter vor "-" bestehen nur aus ASCII-Zeichen

ist etwas anderesals Du jetzt sagst.
Mitglied: 93578
93578 Oct 22, 2018 updated at 10:12:35 (UTC)
Goto Top
Sorry,

ich habe mich geirrt. Das hat mir mein Kollege gerade gesagt. Kein Wunder bei zig Millionnen Zeilen...
Mitglied: 93578
93578 Oct 22, 2018 updated at 11:35:30 (UTC)
Goto Top
Hier ist die Lösung:

cut -d- -f1 test.txt > spalte1.txt
while read line
do
/bin/echo -n "$line" | sha1sum >> SHA1.txt  
done < spalte1.txt
cut -d- -f2- test.txt > spalte2.txt
paste SHA1.txt spalte2.txt > fertig.txt
rm SHA1.txt
rm spalte1.txt
rm spalte2.txt

Danke an alle Helfer!