sed Frage
sed Frage
Hallo zusammen,
ich hoffe Ihr könnt mir ein paar Tipps zu meinem Problem geben.
ich habe eine sehr große Textdatei , die ich nach einem bestimmten Inhalt durchsuchen muss.
Der zu suchende Inhalt sieht ungefähr so aus:
BEISPIELTEXT_DER_DATEI@0815 [XX YY20+AB]
744376 744160 660003 0 0 0 0 0
Die eckigen Klammern sind nur in diesen gesuchten Zeilen enthalten.
Was ich als Ausgabe brauche, ist der Inhalt der eckigen Klammern und die Zahl in der dritten Spalte der darauf folgenden Zeile.
Mein sed-Wissen ist nicht sehr groß aber ich hoffe Ihr könnt mir ein paar Tipps geben.
Vielen Dank im Voraus
fk
ich hoffe Ihr könnt mir ein paar Tipps zu meinem Problem geben.
ich habe eine sehr große Textdatei , die ich nach einem bestimmten Inhalt durchsuchen muss.
Der zu suchende Inhalt sieht ungefähr so aus:
BEISPIELTEXT_DER_DATEI@0815 [XX YY20+AB]
744376 744160 660003 0 0 0 0 0
Die eckigen Klammern sind nur in diesen gesuchten Zeilen enthalten.
Was ich als Ausgabe brauche, ist der Inhalt der eckigen Klammern und die Zahl in der dritten Spalte der darauf folgenden Zeile.
Mein sed-Wissen ist nicht sehr groß aber ich hoffe Ihr könnt mir ein paar Tipps geben.
Vielen Dank im Voraus
fk
Re: sed Frage
Das Problem ist, dass du in der Folgezeile noch wissen musst, dass es einen Treffer gab. Die sed-Lösung kenne ich leider nicht.
fgrep-Lösungsansatz:
awk-Lösungsansatz:
Leider weiß ich nicht wie man den Inhalt der eckigen Klammern rausgeneriert.
fgrep-Lösungsansatz:
Code: Alles auswählen
fgrep -A1 BEISPIEL datei
Code: Alles auswählen
awk '{if ($0 ~ /BEISPIELTEXT/){gefunden=1;print $0} else {if (gefunden==1) {gefunden=0;print $3}}}' datei
Re: sed Frage
Leider sagst du nicht nach was *genau* gesucht werden kann. Suche ich also Zeilen die ``BEISPIELTEXT_DER_DATEI'' enthalten, oder welche die irgendwo eckige Klammern haben, oder eine Zeile die genau so aussieht? Welches sind also die festen und welches die variablen Teile der gesuchten Zeile(n)?fiberkill hat geschrieben: Der zu suchende Inhalt sieht ungefähr so aus:
BEISPIELTEXT_DER_DATEI@0815 [XX YY20+AB]
744376 744160 660003 0 0 0 0 0
Die eckigen Klammern sind nur in diesen gesuchten Zeilen enthalten.
Ich nehme einfach mal an, dass du diejenigen Zeilen suchst, die eckige Klammern enthalten.
Gibt es einen Grund, dass du eine Loesung in sed willst, oder vermutest du nur, dass sed ein geeignetes Tool waere? Das macht naemlich einen grossen Unterschied. Ich kann sowas mit sed schreiben, aber es waere umstaendlich im Vergleich zu einer Loesung mit awk. Ich waehle deshalb lieber awk.Was ich als Ausgabe brauche, ist der Inhalt der eckigen Klammern und die Zahl in der dritten Spalte der darauf folgenden Zeile.
Mein sed-Wissen ist nicht sehr groß aber ich hoffe Ihr könnt mir ein paar Tipps geben.
Code: Alles auswählen
/\[.*\]/ {
sub(/.*\[/,""); sub(/\].*/,"")
klammern=$0
getline
printf("klammern: `%s' -- 3.feld: `%s'\n", klammern, $3)
}
Wenn's Fragen zum Verstaendis gibt, dann fragt!
Zuletzt geändert von Meillo am 24.09.2014 11:38:23, insgesamt 1-mal geändert.
Grund: Vertipper korrigiert: s/}/)/
Grund: Vertipper korrigiert: s/}/)/
Use ed once in a while!
Re: sed Frage
`grep -A1' sieht in sed so aus:uname hat geschrieben:Das Problem ist, dass du in der Folgezeile noch wissen musst, dass es einen Treffer gab. Die sed-Lösung kenne ich leider nicht.
Code: Alles auswählen
sed -n '/foo/{N;p}'
Falls du in awk nicht nur im C-Stil programmieren willst, sondern im awk-Stil, dann versuch's mal in der Art:awk-Lösungsansatz:Code: Alles auswählen
awk '{if ($0 ~ /BEISPIELTEXT/){gefunden=1;print $0} else {if (gefunden==1) {gefunden=0;print $3}}}' datei
Code: Alles auswählen
awk '
gefunden==1 {gefunden=0;print $3}
$0 ~ /BEISPIELTEXT/ {gefunden=1;print $0}
'
Und `$0 ~' kannst du weglassen, da das automatisch angenommen wird. Auch `print' verwendet ganz automatich $0, wenn man nichts angibt. Insofern waere dein Code in dieser Form awk-artiger:
Code: Alles auswählen
awk '
gefunden==1 {gefunden=0;print $3}
/BEISPIELTEXT/ {gefunden=1;print}
'
Use ed once in a while!
Re: sed Frage
Hallo nochmal.
Vielen Dank an all, die mir geholfen haben.
Die AWK-Lösung von Meillo funktionierte einwandfrei.
Eine Frage hätte ich aber noch.
Das Ergebis dieses AWK-Befehls ist eine lange Liste.
Aus Gründer der Übersichlichkeit möchte ich jetzt noch, dass die Zahl der dritten Spalte der zweiten Zeile neben dem Inhalts der eckigen Klammern steht.
Beispiel:
So sieht der Abschnit in der Originaldatei aus:
BEISPIELTEXT_DER_DATEI@0815 [XX YY20+AB]
744376 744160 660003 0 0 0 0 0
Und so möchte ich ihn haben.
XX YY20+AB;660003
Gruss und Danke
FK
Vielen Dank an all, die mir geholfen haben.
Die AWK-Lösung von Meillo funktionierte einwandfrei.
Eine Frage hätte ich aber noch.
Das Ergebis dieses AWK-Befehls ist eine lange Liste.
Aus Gründer der Übersichlichkeit möchte ich jetzt noch, dass die Zahl der dritten Spalte der zweiten Zeile neben dem Inhalts der eckigen Klammern steht.
Beispiel:
So sieht der Abschnit in der Originaldatei aus:
BEISPIELTEXT_DER_DATEI@0815 [XX YY20+AB]
744376 744160 660003 0 0 0 0 0
Und so möchte ich ihn haben.
XX YY20+AB;660003
Gruss und Danke
FK
Re: sed Frage
program.awk:
Code: Alles auswählen
/\[.*\]/ {
sub(/.*\[/,""); sub(/\].*/,"")
klammern=$0
getline
print klammern ";" $3;
}
Code: Alles auswählen
awk -f program.awk datei
Re: sed Frage
Man bist Du krass drauf.
das war genau das was ich wollte.
Vielen dank.
Wärst Du noch so nett und erklärst es mir. sonst muss ich beim nächsten Problem wieder posten.
fk
das war genau das was ich wollte.
Vielen dank.
Wärst Du noch so nett und erklärst es mir. sonst muss ich beim nächsten Problem wieder posten.
fk
Re: sed Frage
Ich verstehe recht wenig von awk. Aber das Programm von Meillo konnte ich entsprechend aufbereiten. Wobei nun nur noch nach eckigen Klammern gesucht wird. Solltest du was anderes suchen musst du es evtl. noch anpassen.
Dann statt
eher
Dann statt
Code: Alles auswählen
/\[.*\]/ {
Code: Alles auswählen
/BEISPIEL.*\[.*\]/ {
Re: sed Frage
Klar.fiberkill hat geschrieben: Wärst Du noch so nett und erklärst es mir. sonst muss ich beim nächsten Problem wieder posten.
Code: Alles auswählen
/\[.*\]/ {
Code: Alles auswählen
sub(/.*\[/,""); sub(/\].*/,"")
Code: Alles auswählen
klammern=$0
Code: Alles auswählen
getline
Code: Alles auswählen
print klammern ";" $3;
Code: Alles auswählen
}
Use ed once in a while!