2017-10-12 1 views
1

Mein Problem ist, ich muss die Zeilennummer aus dem Ende einer Reihe von Textdateien Namen mit einer Größe größer als 0 extrahieren. Sobald ich die Liste habe von Zeilennummern muss ich die Zeilen aus der Master-Textdatei extrahieren.Zeilen aus mehreren Textdateinamen extrahieren und dann diese Zeilen aus einer Textdatei ziehen - Linux

Ich habe herausgefunden, wie man den ersten Schritt mit dem folgenden Befehl, der alle Dateien mit der .sh.e mit einer Größe von> 0 Bytes findet, Es zieht dann die letzten paar Zeichen der JobID und eine Sed Befehlsleisten aus den führenden 7 Zeichen (das kann wahrscheinlich auch etwas eleganter gemacht werden), was uns dann eine schöne Liste von Zeilennummern gibt.

Dateiname Beispiele:

Job_2017-09-25-08-50-28-ahill.sh.e1191.92 
Job_2017-09-25-08-50-28-ahill.sh.e1191.102 
Job_2017-09-25-08-50-28-ahill.sh.e1191.252 
Job_2017-09-25-08-50-28-ahill.sh.e1191.301 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed 's/^.\{7\}//' 

92 
102 
252 
301 

Ich brauche dann die Zeilen aus einem Text-Datei zu extrahieren, die mir die ursprünglichen Speicherort der Datei meiner Jobs erzählt.

Ich habe Probleme, diese an sed oder awk zu übergeben, um das Hauptprotokoll zu analysieren. Ich habe folgendes versucht:

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk (NR=sed s/^.\{7\}//) ../temp/files.2017-09-26.txt 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed -n "$(sed 's/^.\{7\}//')p" ../temp/files.2017-09-26.txt 

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk "NR==$(sed 's/^.\{7\}//')" ../temp/files.2017-09-26.txt 

Alle scheinen zu versagen oder geben einen Ausdruck Fehler. Ich kann es in Excel für jetzt tun, aber möchte dies über die Befehlszeile tun, wie ich es oft tun muss.

Irgendeine Idee?

Dank

+0

dieser Satz „Ich muss dann die Zeilen aus einem Text-Datei extrahieren, die mir die ursprünglichen Speicherort der Datei meiner Jobs erzählt.“, Ist unklar. Was sollte das Endergebnis sein? – RomanPerekhrest

+0

Das Endergebnis ist eine Liste von Zeichenfolgen in Zeile (n) X (die wir vom ersten Befehl erhalten haben) aus der Datei ../temp/files.2017-09-26.txt. Was ist eine große Liste von Pfaden zu den ursprünglichen WAV-Dateien. –

+0

also jedes Mal sollte das Skript die Datei '/ temp/files.2017-09-26.txt' für die Nummern' 92', '102' usw. suchen und die passenden Zeilen mit diesen Zahlen ausgeben? – RomanPerekhrest

Antwort

1

Optimiert und schnell finden Lösung:

find . -type f -name "*.sh.e[0-9]*" -size +0c -exec sh -c 'fn=$1; n=${fn##*.}; \ 
     sed -n "$n p" ../temp/files.2017-09-26.txt' _ {} \; 

  • fn=$1 - fn Variable mit dem Dateinamen von findet Befehl

  • n=${fn##*.} zurückgegeben zugeordnet ist - Extrahieren des benötigte numerische Suffix aus dem Dateinamen (d.h.92, 102 etc)

+0

Ich bin nicht sicher zu verstehen, was er mehr erreichen wollte, das Suffix abgerufen ist nicht die Zeilennummer extrahieren? es ist nur ein Grep auf diese Zahlen? – Esteban

+0

@Esteban, siehe Kommentare unter der Frage – RomanPerekhrest

+0

Ich weiß, aber er sagte 2 mal (eins in der Frage, und eins im ersten Kommentar), dass es Zeilennummer war, also denke ich, dass er misundestud, was Sie durch "übereinstimmende Zeilen" impliziert " – Esteban

1

nicht das schönste Befehl, aber es sollte funktionieren:

sed -n $(find . -name "*.sh.e*" -type f -size +0c |rev |cut -d'.' -f1 | tr "\n" " " | sed -e 's/ /p;/g' -e 's/;$//g') < ../temp/files.2017-09-26.txt 

Was es tut:

  • find . -name "*.sh.e*" -type f -size +0c: Führen Sie die Dateien
  • rev: reverse die Buchstaben der Dateiname
  • cut -d'.' -f1: Schneiden Sie das erste Feld, das durch . begrenzt ist: dh. die Linien
  • tr "\n" " ": die neue Linie durch einen
  • sed 's/ /p;/g'
  • Raum ersetzen: ersetzen die Räume, die durch p;
  • sed 's/;$//g': Streifen der letzten ;^

es das Muster durch den sed -n 'np;mp' < file.txt Befehl benötigt erstellen, wo n und m sind line number

+0

Ich habe 930 Ergebnisse und Ihr Befehl scheint nur 850 davon aufzulisten. finden. -name "* .sh.e *" -Typ f -size + 0c | wc -l Nicht sicher warum. –

+0

Ich weiß nicht, wo der Fehler ohne Dateibeispiel auftreten konnte. Ich verspottete den Befehl mit 2 Dateien und einem Protokoll von 5 Zeilen;). Sie könnten versuchen, eine sed für jede Datei auszuführen, um zuerst den Befehl zu testen, etwa: – Esteban

+0

@MasaAsh 'find. -name "* .sh.e *" -Typ f -size + 0c | rev | Schnitt -d '.' -f1 | xargs -I% sed -n% p ../ temp/files.2017-09-26.txt' – Esteban

Verwandte Themen