A
Anonymous
Gast
Dann wie folgt zu lösenFlash schrieb:Wenn ich das hier ausführe: foo@bar:~/Downloads$ grep Transaktionen *.txt > foobar.txt
dann sieht das resultat in foobar.txt so aus:
Code:report (10).txt:Transaktionen: 30 report (11).txt:Transaktionen: 66 report (12).txt:Transaktionen: 27 report (13).txt:Transaktionen: 42 ..... report (9).txt:Transaktionen: 29 report.txt:Transaktionen: 18
die Dateinamen werden mit ausgegeben. Ich möchte da gern einen anderen Trenner hinter dem Dateinamen haben. Statt : halt , oder gar kein Dateiname.
ist der falsche Weg, Immer so einfach wie nur möglich, und nicht im ersten Schritt gleich irgendwelche aufkommenden Probleme gleich mit zusätzlichen Code beseitigen, sonder immer zuerst mal in die Manpage schauen ob es da nicht vielleicht Optionen gibt die einem nicht so geläufig sind, aber die Probleme schon vorn vorne herein beseitigen.framp schrieb:Hänge einfach einen Pipe zu sed dran wo Du das erste : durch ein , ersetzt![]()
Code:| sed 's/:/,/'
grep -h unterdrückt die Ausgabe von Dateinamen. -H ( wie framp schon oben bemerkt) gibt sie expilizied mit aus, auch dann wenn nur eine einzige Datei durchsucht wird.
Mal abgesehen, was du 3 Spalten weiter als Zahl bezeichnest steht in Hochkommas eingeschlossen und ist folglich Text, aber wir wollen mal nicht kleinlich sein.Flash schrieb:die CSV Zeilen sehen ungefähr so aus
Code:"asdasd_asdasda_dasdas","TYP-A","000-123213-4121231","fhjkasdasdsa asdas asdasda","12","35678","fhjkasdasdsa asdas asdasda" "avgask_fsaasda_dasdas","TYP-A","000-123213-4121231","fhjkasdasdsa asdas asdasda","13","35678","fhjkasdasdsa asdas asdasda" "asdasd_asdasda_dasdas","TYP-B","000-123213-4121231","fhjkasdasdsa asdas asdasda","2","35678","fhjkasdasdsa asdas asdasda" "asdasd_asdasda_dasdas","TYP-A","000-123213-4121231","fhjkasdasdsa asdas asdasda","222","35678","fhjkasdasdsa asdas asdasda"
Ich möchte nun gern folgendes machen: Wenn in der Spalte mit TYP- ein "TYP-B" steht, dann soll die Zahl 3 Spalten weiter hinten negiert werden. Also im Fall oben aus der 2 soll eine -2 werden.
Ich hatte mir überlegt, man könnte ja einen RegEx Matcher bauen der ab TYP-B sucht und durch ein geschicktes Muster genau das erreicht. Nur ist mein RegEx doch zu schwach.
sicherlich kann man da einen RegEx bauen, der das erledigt, zB.
Code:
sed 's/\(TYP-B\",[^,]\+,[^,]\+,\"\)/\1-/'
Möglichkeit B wäre in der Bash die Zeile in Spalten zu zerlegen, dann könntest du bequem die Spalte 2 nach "TYP-A/B" absuchen und dann die Spalte 5 bequem ändern. und entsprechend dem Ergebnis von Test auf Spalte 2 das Ganze dann in die jeweilige Datei schreiben. Kein Problem sowas in Bash zu schreiben, aber kann dir nicht versprechen das dann noch jeder annähernd verstehst, was dort passiert.
Code:
#!/bin/bash
FILEA="FILE_TYP_A.txt"
FILEB="FILE_TYP_B.txt"
echo "Begrüßungstext für Type-A" > $FILEA
echo "Begrüßungstext für Type-B" > $FILEB
OLD_IFS=$IFS
IFS=","
while read A B C D E F G
do
if [ "${B}" == \""TYP-B\"" ]
then
E=${E/\"/\"-}
echo $A,$B,$C,$D,$E,$F,$G >> $FILEB
else
if [ -n "$B" ]
then
echo $A,$B,$C,$D,$E,$F,$G >> $FILEA
fi
fi
done < <(cat $*)
IFS=$OLD_IFS
Wobei wir wieder bei meinem Satz von oben sind, Immer so einfach wie nur möglich, also wenn möglich ein Programm/Tool verwenden das für die Aufgabe geeignet ist
und möglichst intern schon genau so arbeitet wie man es braucht, das spart nen Haufen Zeit bei der Scripterstellung und beim Testen.
awk bietet sich hier natürlich an
Code:
#!/usr/bin/awk -f
BEGIN {
FS=","
OFS=","
FILE1="TYP_A.txt"
FILE2="TYP_B.txt"
print "HALLO Begrüßungstest für TYP_A" > FILE1
print "HALLO Begrüßungstest für TYP_B" > FILE2
}
$2 ~ /TYP-A/ {
print ( $0 ) >> FILE1
}
$2 ~ /TYP-B/ {
sub("\"","\"-",$5) # im 5. Feld wird das erste " durch "- ausgewechselt
print( $0 ) >> FILE2
}
Ist auch nicht schwieriger zu verstehen und die gesamte Dokumentation für awk umfasst nur die Halbe Größe der Manpages von bash und bashutils die man eventuell durchsuchen müßte um das bashscript zu verstehen.
robi