giphy86 schrieb:
Er soll praktisch nur die 12 in Zeile 23 löschen
Die Spalte.
Mir war so, als ob sie gelöscht werden soll, wenn weniger als 3 Zeichen lang:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | while read line
do
vorne=$(echo $line | cut -d"|" -f 1-22)
kritisch=$(echo $line | cut -d"|" -f 23)
rest=$(echo $line | cut -d"|" -f 24- )
if (( ${#kritisch} < 3 ))
then
echo $vorne"kritisch"$rest
else
echo $vorne$kritisch$rest
fi
done < dpetest.txt
JFGDOI000000|12|12|20180328|707|850|190|0||0|85058838|0|||0||||||1|kritisch|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1|706|||0000|||1|0|||||||
|
Du siehst, auch mir ist eine leere Zelle nicht spectaculär genug.
Mein erster Ansatz war viel besser, mit sed - leider ein Scheitern auf ganzer Linie - keine Ahnung, was ich das verbastelt habe – ah, logisch, jetzt habe ich den Fehler gefunden:
| sed -r 's/^(([^|]*\|){22})([0-9]{1,2}\|)(.*)/\1|-- --\4/' dpetest.txt
JFGDOI000000|12|12|20180328|707|850|190|0||0|85058838|0|||0||||||1|||-- --|||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
sdfsdf6205503762|Ddfsf|30|20180328|706|850|190|0||0|85058838|0|||0||||||1||706||||0000|||1|0|||||||
|
Das ersetzt (s:=substitute) in einem String, verankert am Zeilenanfang (^) Muster (...) derart, dass sie kein Pipesymbol enthalten [^|]* und von beliebiger Länge sein dürfen, inklusive leer, aber von einem Pipesymbol gefolgt werden müssen [^|]*\| (welches maskiert werden muss, da es sonst 'ODER' bedeuten will. Und von diesem Muster ([^|]*\|)
suchen wir 22 Stück ([^|]*\|){22}
und packen sie in Klammern, um sie später zu referenzieren (([^|]*\|){22})
wobei die äußere Klammer die erste, öffnende Klammer ist. Wenn das von 1-2 Ziffern gefolgt wird, die ihrerseits wieder ein Pipesymbol im Schlepptau haben, also keinesfalls 3 Ziffern, ([0-9]{1,2}\|)
und dann kommt noch der poplige Rest (.*), dann schlagen wir zu, und ändern das in den ersten Ausdruck, gefolgt von etwas Spektakel, und dem vierten Ausdruck - der zweite ist ein Teilbereich des ersten, der dritte wird unterschlagen, (.*) ist also das vierte Klammernpaar: /\1|– –\4/' dpetest.txt
Treffen wir dieses Muster nicht an, tun wir nichts - Output = Input.