2013-02-12 13 views
37

Ich möchte Komma , am Ende jeder Zeile in meiner Datei entfernen. Wie kann ich es tun, außer Teilstring-Funktion in awk zu verwenden. bitte vorschlagen me.ThanksSo entfernen Sie ein Zeichen am Ende jeder Zeile in Unix

Beispieleingabe

 SUPPLIER_PROC_ID BIGINT NOT NULL, 
     BTCH_NBR INTEGER NOT NULL, 
     RX_BTCH_SUPPLIER_SEQ_NBR INTEGER NOT NULL, 
     CORRN_ID INTEGER NOT NULL, 
     RX_CNT BYTEINT NOT NULL, 
     DATA_TYP_CD BYTEINT NOT NULL, 
     DATA_PD_CD BYTEINT NOT NULL, 
     CYC_DT DATE NOT NULL, 
     BASE_DT DATE NOT NULL, 
     DATA_LOAD_DT DATE NOT NULL, 
     DATA_DT DATE NOT NULL, 
     SUPPLIER_DATA_SRC_CD BYTEINT NOT NULL, 
     RX_CHNL_CD BYTEINT NOT NULL, 
     MP_IMS_ID INTEGER NOT NULL, 
     MP_LOC_ID NUMERIC(3,0), 
     MP_IMS_ID_ACTN_CD BYTEINT NOT NULL, 
     NPI_ID BIGINT, 

Antwort

35

können Sie sed verwenden:

sed 's/,$//' file > file.nocomma 

und was letztes Zeichen zu entfernen:

sed 's/.$//' file > file.nolast 
+0

Anstatt die Ausgabe an eine neue Datei zu senden, können Sie auch die Option -i an sed anhängen, um sie in 'Datei' zu schreiben – bsmoo

+2

@ ubuntu101010101 In der Tat, aber die Verwendung dieser Option kann stattdessen einen 'sed' Fehler auslösen. Die Frage ist mit Unix markiert. Die Verwendung eines nicht POSIX GNUism würde meinen Vorschlag nicht tragbar machen. – jlliagre

59

versucht dies zu tun:

awk '{print substr($0, 1, length($0)-1)}' file.txt 

Dies ist allgemeinerer als nur das letzte Komma entfernen, aber jede letzte Zeichen

Wenn Sie es möchten, nur mit awk das letzte Komma entfernen:

awk '{gsub(/,$/,""); print}' file.txt 
+0

Ich habe gerade so etwas probiert, und aus irgendeinem Grund brauchst du eine 'Länge ($ 0)' ohne die '-1' ... es scheint mir auch nicht sehr sinnvoll zu sein. Aber was auch immer, es ist Bash, solange es funktioniert. – enriched

2

alternative Befehle, die gleiche Arbeit

tut
tr -d ",$" < infile 
awk 'gsub(",$","")' infile 
+3

Ihr 'tr' Vorschlag ist falsch. Es entfernt alle Kommata, wo auch immer sie sind, nicht nur die letzte. Dein 'awk' basiertes ist in Ordnung, obwohl' sub' anstelle von 'gsub' ausreichen würde. Es kann nicht mehr als ein Zeilenende pro Zeile geben. – jlliagre

+0

Der 'tr'-Vorschlag entfernt auch' $ 'Zeichen, die in der zu verarbeitenden Datei vorkommen könnten. – jlliagre

0

Dieses Perl-Code entfernt am Ende der Zeile Komma:

perl -pe 's/,$//' file > file.nocomma 

Diese Variante funktioniert nach wie vor, wenn es Leerzeichen nach dem Komma ist:

perl -lpe 's/,\s*$//' file > file.nocomma 

Diese Variante, die Datei an Ort und Stelle bearbeitet:

perl -i -lpe 's/,\s*$//' file 

Diese Variante die Datei an Ort und Stelle bearbeitet, und macht file.bak Sicherung:

perl -i.bak -lpe 's/,\s*$//' file 
3

Ein awk Code basiert auf RS.

awk '1' RS=',\n' file 

oder:

awk '1' RS='.\n' file 

Hinweis: Punkt. Streichhölzer

awk 'BEGIN{RS=",\n"}1' file 

Dieses letzte Beispiel für jede char vor Newline gültig jedes Zeichen außer Zeilenumbrüche.

Erklärung

awk ermöglicht es uns, andere Datensatz (Zeile) regex Separatoren zu verwenden, müssen wir nur noch das Komma vor der Pause Linie umfassen (oder dot für jeden char) in dem einen verwendet für die input, die RS.

Hinweis: Was das 1 bedeutet?

Kurze Antwort, es ist nur eine Abkürzung, um die Verwendung der print Anweisung zu vermeiden. In awk, wenn eine Bedingung die Standardaktion angepasst wird ist die Eingabezeile, zB zu drucken:

$ echo "test" |awk '1' 
test 

Das ist, weil 1 wird immer wahr, so ist dieser Ausdruck entspricht:

$ echo "test"|awk '1==1' 
test 
$ echo "test"|awk '{if (1==1){print}}' 
test 

Dokumentation

Überprüfen SieRecord Splitting with Standard awk und Output Separators.

+1

Dies wurde aktualisiert, da ich in der Lage war, die Ausgabe von 'ls' in die zweite Anweisung zu leiten und eine bestimmte Dateierweiterung zu entfernen. Einige der anderen Antworten hätten vielleicht auch dafür funktioniert, aber diese war für mich leichter zu lesen, während ich immer noch nett und kurz bleibe. –

+0

Tatsächlich habe ich bemerkt, dass nur 'RS' benötigt wird, daher ist der endgültige Ausdruck tatsächlich kürzer;) – klashxx

Verwandte Themen