ireng
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
Hallo Community, ich versuche eine Zeilennummer zu ermitteln und an ein Programm zu übergeben. Mit cat -n test | grep wort erhalte ich alle diejenigen Zeilen (mit Zeilennummer) in denen wort auftritt. Wie kann ich am besten die Zeilen Nummer der gefundenen Ergebniszeilen isoliert in einer Variablen abspeichern, damit diese Variable an ein aufrufendes Program übergeben wird?? Vielen Dank im Voraus für Euere Lösungsansätze und Beispiele! Gruss, Ireng PS. Die zu untersuchenden Dateien können sehr umfangreich sein, bis 999 Zeilen!
|
misterunknown
Ehemalige
Anmeldungsdatum: 28. Oktober 2009
Beiträge: 4403
Wohnort: Sachsen
|
Useless use of cat. Ausgeben der Zeilennummern:
| grep -n "${SUCHBEGRIFF}" ${DATEI} | cut -d":" -f1
|
In Array speichern:
| array=($(grep -n "${SUCHBEGRIFF}" $DATEI | cut -d":" -f1))
|
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
@misterunknown Vielen Dank für die schnelle und kompetente Unterstützung.
Dein Lösungs Vorschlag funktioniuert bestens. Gruss, Ireng
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
ireng schrieb:
PS. Die zu untersuchenden Dateien können sehr umfangreich sein, bis 999 Zeilen!
Dateien mit unter 1000 Zeilen mit durchschnittlicher Länge sind mit ca. 100k alles andere als "umfangreich" - zumindest heutzutage. ☺
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
@rklm Danke für die *Erleuchtung*! 💡 Gruss, ireng
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Eine nette Alternative bietet sed : sed -n "/${suchbegriff}/=" "$datei" ... hübsch minimalistisch, wie bei sed so oft. LG, track
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
Vielen Dank für Euere geleistete Unterstützung! Jetzt möchte ich noch für jedes Keywort die gefundenen Zeilen Nummern in eine Datei schreiben: Zum Beispiel: keywort Zeilennummer(n) program 2,4,5,6,....... Die keyworte lese ich von einer separaten Datei ein mit: grep -i -f datei.txt -n $1 | cut -d":" -f1 array=($(grep -n $1 | cut -d":" -f1)) Übergabe Parameter ist die zu untersuchende Datei mit jeweils einem Keywort in jeder zeile, wie von grep verlangt! Über Lösungsvorschläge freue ich mich sehr und bedanke mich jetzt schon mal recht herzlic bei Euch! Gruss, Ireng
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
ireng schrieb:
Jetzt möchte ich noch für jedes Keywort die gefundenen Zeilen Nummern in eine Datei schreiben: Zum Beispiel: keywort Zeilennummer(n) program 2,4,5,6,.......
Hm... | egrep -wio '[[:alpha:]]+' | while read word; do echo -n "$word "; fgrep -inh "$word" x | cut -d: -f1 | paste -sd , ; done
|
Die keyworte lese ich von einer separaten Datei ein mit: grep -i -f datei.txt -n $1 | cut -d":" -f1 array=($(grep -n $1 | cut -d":" -f1))
Bitte nutze mal das Syntaxhighlighting des Forums!
Übergabe Parameter ist die zu untersuchende Datei mit jeweils einem Keywort in jeder zeile, wie von grep verlangt!
Das verstehe ich nicht: Du brauchst doch zwei Dateien, eine mit den Suchwörtern und eine, in der gesucht wird.
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
Danke für Deinen Hinweis! Die Suchwörter stehen in datei.txt, die Datei in der gesucht wird, wird als Parameter übergeben ($1)! Sorry, für die missverständliche Ausdrucksweise! Gruss, Ireng PS. Aus Deinem Vorschlag werde ich leider nicht ganz schlau! Sorry!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
ireng schrieb:
PS. Aus Deinem Vorschlag werde ich leider nicht ganz schlau! Sorry!
Ich sehe gerade, dass da etwas Entscheidendes fehlt. So sollte es aussehen: | egrep -wio '[[:alpha:]]+' datei.txt | while read word; do echo -n "$word "; fgrep -inhw "$word" text.txt | cut -d: -f1 | paste -sd , ; done
|
Mit der Annahme, dass "datei.txt" die Suchwörter enthält und in der Datei "text.txt" gesucht wird. Führ es einfach mal aus und schau. Die Lösung ist nicht sonderlich effizient, aber funktioniert. Effizienter würde ich das in Ruby machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | words = {}
File.foreach(ARGV.shift) do |line|
line.scan(/\w+/) {|word| words[word] = []}
end
File.to_enum(:foreach, ARGV.shift).each_with_index do |line, index|
index += 1
line.scan(/\w+/) {|word| lines = words[word] and lines << index}
end
words.each do |word, indexes|
indexes.uniq!
printf "%s %s\n", word, indexes.join(',')
end
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Wenn es jetzt darum geht, verschiedene Dateien zu verknüpfen, wird es mit einem Shell-Skript doch sehr schnell unübersichtlich. Deshalb würde ich hier (ähnlich, wie Robert mit seinem Ruby) auch vorschlagen, sowas mit "höheren" Programmsprachen zu machen. Mein Favorit wäre dabei awk - das kann alle geforderten Sachen recht elegant und übersichtlich. Dabei würde ich das Suchwort als (assoziativen) Array-Index benutzen. Das ist sehr effektiv und übersichtlich: | #!/usr/bin/awk -f
BEGIN { RS=":" } # setze Trennzeichen :
ARGIND==1 { z[$1]= z[$1] FNR } # hänge die Zeilennummer an die Arrayzelle zum Stichwort an
ARGIND==2 { print $1, z[$1] } # drucke Suchwort und zugehörige Nummern
|
oder, als Einzeiler geschrieben: | awk -F ":" 'ARGIND==1 { z[$1]= z[$1] FNR } ARGIND==2 { print $1, z[$1] }' datenbestand.txt suchworte.txt
|
LG, track
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
@rklm Vielen Dank für Deinen Lösungsvorschlag,der genau das tut was und wie ich es mir vorgestellt habe. Das script gibt alle Keywörter mit Zeilenreferenz aus, auch diejenigen, bei denen keine Referenz in der zu untersuchende Datei gefunden wird. Wie kann ich das am besten unterdrücken, bzw. diese Keywörter NICHT in eine Datei result.txt ausgeben?
egrep -wio '[[:alpha:]]+' | while read word; do echo -n "$word "; fgrep -inh "$word" x | cut -d: -f1 | paste -sd , ; done >result.txt Schreibt die Ergebnisse in result.txt Ich bedanke mich für Deine Unterstützung bei Dir! @track Vielen dank für Deine Unterstützung und Lösungsvorschlag. Der Einzeiler gibt alle Keywörter aus, aber ohne Zeilen Referenz. Was habe ich da falsch gemacht?? Gruss, Ireng
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Weiß ich nicht, vielleicht habe ich auch was falsch verstanden ? Als Datenvorlage hatte ich verstanden, dass es 2 Dateien gibt: 1) den Datenbestand und 2) die Stichwortdatei. Beide als reine Textliste in dem Format: Stichwort1: irgendwas
Stichwort2: noch irgendwas
... und eigentlich müsste mein Skript (wie gesagt, beide Versionen sind bis auf die Schreibweise gleich) die Daten wie gewünscht ausgeben. Bei mir tut er das auch: track@track:~$ cat blubb.dat
vogel: nnnnn
wild: lllll
was: mmmmmm
Vogel: ccc
was:
was: ?
was
track@track:~$ awk -F ":" 'ARGIND==1 { z[$1]= z[$1] " " FNR } ARGIND==2 { print $1, z[$1] }' blubb.dat blubb.dat
vogel 1
wild 2
was 3 5 6 7
Vogel 4
was 3 5 6 7
was 3 5 6 7
was 3 5 6 7 Allerdings hatte ich das Trennzeichen vergessen. Was die unterdrückten Leerzeilen angeht, da kann man ja eine entsprechende Zusatzbedingung einbauen. LG, track
|
ireng
(Themenstarter)
Anmeldungsdatum: 17. Januar 2008
Beiträge: 263
|
@rklm: wie könnte die Zusatzbedingung für Dein script (einzeiler) für das ausfiltern von Keywörten aussehen, die nicht in der zu untersuchenden Datei gefunden werden?? Lieben Gruß, Ireng
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
ireng schrieb:
wie könnte die Zusatzbedingung für Dein script (einzeiler) für das ausfiltern von Keywörten aussehen, die nicht in der zu untersuchenden Datei gefunden werden??
| ... | egrep '[[:digit:]]$' >result.txt
|
|