
Ich habe eine CSV-Datei mit 7 Spalten. Sie hat leere Zellen und einige Leerzeichen zwischen den Zellen. Wie kann ich die leeren Zellen durch NA ersetzen und zusätzliche Leerzeichen entfernen? Vielen Dank!
So sieht meine Datei aus, aber hier scheint sie sich zu verziehen, wenn ich sie kopiere und einfüge.
130070078,PPW0001,1,4,4HW ,2,15.61943874
120040039,PPW0002,0,0, ,0,0
120040043,PPW0003,1,3,3WE ,1,14.43394935
Antwort1
Deine Antwort:
sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' > file2
So erhalten Sie „NA“ im letzten Feld, wenn es leer ist:
sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'> file2
Sie könnten auch verwenden:
sed 's/,,/,NA,/g' file1 | tr -d ' ' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'
Antwort2
Die Antwort von αғsнιη hat bei mir funktioniert, aber ich möchte es kurz erläutern.
Ich habe so etwas versucht:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'
Welche Ausgänge
1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6
Aufgrund der wiederholten leeren Felder ist das letzte Komma Teil der ersten Ersetzung und der Beginn der nächsten gewünschten Ersetzung, sodass nur jedes zweite leere Feld ersetzt wird.
Jetzt könnten Sie etwas tun wie:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'
oder
sed 's/,,/,-,/g;s/,,/,-,/g'
Dadurch werden alle Zellen ersetzt, da der zweite Befehl die fehlenden Zellen abruft. Das ist allerdings etwas chaotisch.
Der Befehl von αғsнιη macht im Wesentlichen dasselbe, indem er ein Label und einen Sprung verwendet, was, soweit ich wusste, möglich ist.
sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'
Ausgabe:
1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6
Der erste Teil des Befehls erstellt also ein Label.
Dann haben wir die gleiche Substitution.
Dann haben wir den Befehl „t“, der bedeutet, dass zum Label gesprungen wird, wenn der vorherige Ersetzungsbefehl erfolgreich war.
Mehr Informationen:http://www.grymoire.com/Unix/Sed.html#uh-59