2016-07-27 20 views
1

Ich habe eine CSV-Datei, in der jede Spalte unnötige zusätzliche Leerzeichen hinzugefügt vor dem eigentlichen Wert enthält. Ich möchte eine neue CSV-Datei erstellen, indem ich alle Leerzeichen lösche.Entfernen von Leerzeichen für alle Spalten einer CSV-Datei in bash/unix

Zum Beispiel

Eine Zeile in Eingabe CSV-Datei

123, ste hen, 456, out put 

Erwartete Ausgabe CSV

123,ste hen,456,out put 

Datei habe ich versucht, awk mit jeder Spalte trimmen, aber es hat nicht funktioniert.

+3

also können Sie zeigen, was Sie ausprobiert haben? – fedorqui

Antwort

2
echo " 123, ste hen, 456, out put" | awk '{sub(/^ +/,""); gsub(/, /,",")}1' 
123,ste hen,456,out put 
mehrere führenden Weißräume zu entfernen ist, wie unten
+1

Aber es kann nicht umgehen _Extra Raum ** S ** _ OP in der Frage in der aktuellen Form angegeben. –

+0

Das wird es tun: 'awk '{sub (/ + /," "); gsub (/ *, * /, ",")} 1 'test.in'. Zuerst entfernt das 'sub' das gesamte führende Leerzeichen auf dem Datensatz und das' gsub' behandelt Leerzeichen um Kommas herum. Record Trailing Space würde ein anderes 'gsub' benötigen, das das erste' sub' ersetzen könnte, etwa so: 'gsub (/^* | * $ /," ")'. –

+0

Danke für Ihren Rat! –

3

awk ist dein Freund.

Eingangs

$ cat 38609590.txt 
Ted Winter, Evelyn Salt, Peabody 
    Ulrich, Ethan Hunt, Wallace 
James Bond, Q, M 
(blank line) 

Script

$ awk '/^$/{next}{sub(/^[[:blank:]]*/,"");gsub(/[[:blank:]]*,[[:blank:]]*/,",")}1' 38609590.txt 

Output

Ted Winter,Evelyn Salt,Peabody 
Ulrich,Ethan Hunt,Wallace 
James Bond,Q,M 

10 Hinweis

  • Dies entfernt die Leerzeilen zu - /^$/{next}. Weitere Informationen finden Sie im Handbuch [ awk ].
7

Diese sed funktionieren sollte:

sed -i.bak -E 's/(^|,)[[:blank:]]+/\1/g; s/[[:blank:]]+(,|$)/\1/g' file.csv 

Dies führt spaes zu entfernen, Räume und Räume um Komma Hinter.

Update: Hier ist ein awk das gleiche zu tun:

awk -F '[[:blank:]]*,[[:blank:]]*' -v OFS=, '{ 
    gsub(/^[[:blank:]]+|[[:blank:]]+$/, ""); $1=$1} 1' file 
+0

[Demo] (http://ideone.com/qKUe9f) – anubhava

+1

Die Zeichenklasse '[[:: blank:]]' ist praktisch, da sie Tabulatoren enthält. – sjsam

+1

Ja, es stimmt mit Space oder Tab überein, aber keine Zeilenumbrüche. – anubhava

-2

Sie könnten versuchen:

  • Ihre Datei: ~/path/file.csv

cat ~/path/file.csv | tr -d "\ " sed "s/, /,/g" ~/path/file.csv

1

Ein anderer Weg, mit awk zu tun: -

$ awk 'BEGIN{FS=OFS=","} {s = ""; for (i = 1; i <= NF; i++) gsub(/^[ \t]+/,"",$i);} 1' <<< "123, ste hen, 456, out put" 
123,ste hen,456,out put 
  • FS=OFS="," setzt das Eingabe- und Ausgabefeldtrenn ,
  • s = ""; for (i = 1; i <= NF; i++) Schleifen über jeden Spalteneintrag up bis zum Ende (dhvon $1, $2 ... NF) und die gsub(/^[ \t]+/,"",$i) schneidet nur die führenden Leerzeichen und nicht irgendwo anders (ein oder mehrere Leerzeichen, beachten Sie die +) aus jeder Spalte.

Wenn Sie möchten, sind diese Aktion für eine ganze Datei tun, schlagen ein einfaches Skript wie unter

#!/bin/bash 
# Output written to the file 'output.csv' in the same path  

while IFS= read -r line || [[ -n "$line" ]]; do # Not setting IFS here, all done in 'awk', || condition for handling empty lines 
    awk 'BEGIN{FS=OFS=","} {s = ""; for (i = 1; i <= NF; i++) gsub(/^[ \t]+/,"",$i);} 1' <<< "$line" >> output.csv 
done <input.csv 
+1

Es gibt kürzere Ansätze als das, netter Versuch aber. Wenn es um Awk geht, ist der allgemeine Trend, elegante idiomatische Ansätze zu schätzen. –

+0

@mona_sax: Anerkannt! – Inian

1
$ cat > test.in 
123, ste hen, 456, out put 
$ awk -F',' -v OFS=',' '{for (i=1;i<=NF;i++) gsub(/^ +| +$/,"",$i); print $0}' test.in 
123,ste hen,456,out put 

oder geschrieben laut mit aus:

BEGIN { 
    FS=","     # set the input field separator 
    OFS=","     # and the output field separator 
} 
{ 
    for (i=1;i<=NF;i++)  # loop thru every field on record 
    gsub(/^ +| +$/,"",$i) # remove leading and trailing spaces 
    print $0    # print out the trimmed record 
} 

Run mit :

$ awk -f test.awk test.in 
+1

Wenn Sie '-F '*, *'' verwenden, brauchen Sie die Schleife nicht, nur 1 'gsub (/^+ | + $ /," ")' und eine Feldzuweisung '$ 1 = $ 1'. –

2

So entfernen Sie leere Zeichen führt mit sed:

$ sed -E 's/(^|,) +/\1/g' file 
123,ste hen,456,out put 

Mit GNU awk:

$ awk '{$0=gensub(/(^|,) +/,"\\1","g")}1' file 
123,ste hen,456,out put 

Mit anderen awks:

$ awk '{sub(/^ +/,""); gsub(/, +/,",")}1' file 
123,ste hen,456,out put 

Um leere Zeichen vor und nach den Werten mit sed zu entfernen :

$ sed -E 's/ *(^|,|$) */\1/g' file 
123,ste hen,456,out put 
GNU awk 210

mit:

$ awk '{$0=gensub(/ *(^|,|$) */,"\\1","g")}1' file 
123,ste hen,456,out put 

Mit anderen awks:

$ awk '{gsub(/^ +| +$/,""); gsub(/ *, */,",")}1' file 
123,ste hen,456,out put 

ändern (ein einzelnes leeres Zeichen) zu [[:blank:]], wenn Sie Registerkarten sowie leere Zeichen haben.

+2

Danke Ed für Ihre Hilfe! Ich habe jetzt gelernt, wie man sed und awk benutzt. – stephenjacob