
Ich versuche, das Muster für eine bestimmte Spalte in den Tausenden von gzippten Dateien auf einem Linux-Rechner abzugleichen, und basierend auf der Übereinstimmung möchte ich den Dateinamen drucken. Wie das geht, erfährst du. Die folgenden Optionen funktionieren bei mir nicht, bitte um Vorschläge. Danke
zgrep 12345 *| awk -F"^" '{if($8==12345) print}'
find . -type f |xargs zcat | awk -F"^" '{if($8==12345) print}'
Antwort1
Am klarsten/einfachsten ist meiner Meinung nach:
while IFS= read -r fname; do
zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)
es besteht aber auch die Möglichkeit, den Dateinamen von zgrep aus auszudrucken und ihn mit awk zu lesen, was möglicherweise effizienter ist (aber davon abhängt, dass der Dateiname kein :
s enthält):
zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'
Beide Lösungen gehen davon aus, dass Ihre Dateinamen keine Zeilenumbrüche enthalten und die erste geht zudem davon aus, dass \t
Ihre Dateinamen keine Escape-Sequenzen enthalten.