2017-06-30 4 views
1

Bei einer Datei foo.txt enthält Dateinamen wie schneiden:Unter Verwendung von mit Trennzeichen ähnlich sed

2015_275_14_1,Siboney_by_The_Tailor_Maids 
2015_275_16_1,Louis_Armstrong_Cant_Give_You_Anything_But_Love 
2015_275_17_1,Benny_Goodman_Trio_Nice_Work_Avalon 
2015_275_18_1,Feather_On_Jazz_Jazz_In_The_Concert_Hall 
2015_235_1_1,Integration_Report_1 
2015_273_2_1_1,Cab_Calloway_Home_Movie_1 
2015_273_2_2_1,Cab_Calloway_Home_Movie_2 

ich die _ in dem Teil vor dem Komma mit . und die _ im zweiten Teil nach der ersetzt werden soll Komma mit einem Leerzeichen.

ich jeweils einzeln mit erreichen kann:

sed -E -i '' 's/([0-9]{4})_([0-9]{3})_([0-9]{2})_([0-9])/\1.\2.\3.\4./' 

für den ersten Teil und den zweiten Teil dann mit:

sed -E -i '' "s/_/ /g" 

Aber ich habe gehofft, zu erreichen, es in einer einfacheren Art und Weise durch den Einsatz geschnitten mit sed, aber das funktioniert nicht:

cut -d "," -f 1 foo.txt | sed -E -i '' "s/_/./g" foo.txt && cut -d "," -f 2 foo.txt | sed -E -i '' "s/_/ /g" foo.txt

Nicht gut.

Also, gibt es eine Möglichkeit, dies awk mit sed oder vielleicht zu erreichen oder vielleicht etwas anderes, wo ich die , als Trennzeichen wie in cut bin Behandlung?

gewünschte Ausgabe:

2015.275.14.1,Siboney by The Tailor Maids 
+0

Sie der erwarteten Ausgabe für detailliertere Informationen geben kann subtitute. – CWLiu

+0

@CWLiu ok. Fertig – Bleakley

Antwort

1

Ähnlich wie @CWLiu 's Antwort, aber ich benutze OFS (Ausgabefeld Trennzeichen) statt zurück in das Komma hinzufügen und hinzufügen newline von der Verwendung von printf.

awk -F ',' 'BEGIN {OFS = FS} {gsub(/_/, ".", $1); gsub(/_/, " ", $2); print;}' foo.txt 

Erläuterung:

-F ',' setzt den Feldseparator

BEGIN {OFS = FS} den Ausgangsfeldtrenn (default Raum) gleich dem Feldtrenn setzt so das Komma ausgedruckt wird zurück

gsub("_", ".", $1) global Substitution in der ersten Spalte

gsub("_", " ", $2) globale Substitution auf der zweiten Säule

print Druck die ganze Linie

+1

Danke! @dosentmatter ausgezeichnete Erklärung! Auch danke Edmorton und Benjaminw und CWliu für die Antworten. Tolle Arbeit für alle! – Bleakley

+1

Beachten Sie, dass das erste Argument für 'gsub()' ein Regexp ist, kein String, daher sollte der Code regexp delimiters ('/.../') nicht string delimiters ('" ... "') verwenden). –

+0

Danke Ed, ich habe die Antwort bearbeitet. Ich bin ein awk noob. – dosentmatter

2

Sie können awk verwenden um Ihr Ziel zu erreichen, ist hier das Verfahren.

$ awk -F',' '{gsub(/_/,".",$1);gsub(/_/," ",$2);printf "%s,%s\n",$1,$2}' file                          
2015.275.14.1,Siboney by The Tailor Maids 
2015.275.16.1,Louis Armstrong Cant Give You Anything But Love 
2015.275.17.1,Benny Goodman Trio Nice Work Avalon 
2015.275.18.1,Feather On Jazz Jazz In The Concert Hall 
2015.235.1.1,Integration Report 1 
2015.273.2.1.1,Cab Calloway Home Movie 1 
2015.273.2.2.1,Cab Calloway Home Movie 2 
+0

Vielen Dank @CWLiu Großartige Arbeit für alle! – Bleakley

+0

@Bleakley, können Sie überprüfen, ob Sie die Antwort akzeptieren, wenn Ihr Problem behoben wurde. – CWLiu

1

Sie könnten cut und paste:

$ paste -d, <(cut -d, -f1 infile | sed 'y/_/./') <(cut -d, -f2 infile | sed 'y/_/ /') 
2015.275.14.1,Siboney by The Tailor Maids 
2015.275.16.1,Louis Armstrong Cant Give You Anything But Love 
2015.275.17.1,Benny Goodman Trio Nice Work Avalon 
2015.275.18.1,Feather On Jazz Jazz In The Concert Hall 
2015.235.1.1,Integration Report 1 
2015.273.2.1.1,Cab Calloway Home Movie 1 
2015.273.2.2.1,Cab Calloway Home Movie 2 

Der Prozess Substitution <() können Sie die Ausgabe von Befehlen wie eine Datei, und paste -d, Pasten die Ausgabe jedes Befehls Seite an Seite, getrennt behandeln durch ein Komma.

Der Befehl sed y transliteriert Zeichen und entspricht in diesem Fall s/_/./g. und s/_/ /g.

Sie können es auch tun, rein in sed, aber es ist ein bisschen unhandlich:

sed 'h;s/.*,//;y/_/ /;x;s/,.*//;y/_/./;G;s/\n/,/' infile 

Erklärt:

h   # Copy pattern space to hold space 
s/.*,// # Remove first part including comma 
y/_// # Replace all "_" by spaces in the remaining second part 
x   # Swap pattern and hold space 
s/,.*// # Remove second part including comma 
y/_/./ # Replace all "_" by periods in the remaining first part 
G   # Append hold space to pattern space 
s/\n/,/ # Replace linebreak with comma 

Oder alternativ (von Kommentar von potong):

sed 's/,/\n/;h;y/_/ /;x;y/_/./;G;s/\n.*\n/,/' infile 

Erklärt:

s/,/\n/  # Replace comma by linebreak 
h   # Copy pattern space to hold space 
y/_//  # Replace all "_" by spaces 
x   # Swap pattern and hold space 
y/_/./  # Replace all "_" by periods 
G   # Append hold space 
s/\n.*\n/,/ # Remove second and third line in pattern space 
+0

Danke @ Benjamin! – Bleakley

+0

Eine Alternative für die Sed-Lösung könnte sein: 'sed 's /,/\ n /; h; y/_//;x;y/_/./;G;s/\n.*\n/,/'Datei' – potong

+0

@potong Schön, lass mich das hinzufügen! –

1
$ awk 'BEGIN{FS=OFS=","} {gsub(/_/,".",$1); gsub(/_/," ",$2)} 1' file 
2015.275.14.1,Siboney by The Tailor Maids 
2015.275.16.1,Louis Armstrong Cant Give You Anything But Love 
2015.275.17.1,Benny Goodman Trio Nice Work Avalon 
2015.275.18.1,Feather On Jazz Jazz In The Concert Hall 
2015.235.1.1,Integration Report 1 
2015.273.2.1.1,Cab Calloway Home Movie 1 
2015.273.2.2.1,Cab Calloway Home Movie 2 
+1

Danke @edmorton! – Bleakley

1

Versuchen Sie, diese für GNU sed:

$ cat input.txt 
2015_275_14_1,Siboney_by_The_Tailor_Maids 
2015_275_16_1,Louis_Armstrong_Cant_Give_You_Anything_But_Love 
2015_275_17_1,Benny_Goodman_Trio_Nice_Work_Avalon 
2015_275_18_1,Feather_On_Jazz_Jazz_In_The_Concert_Hall 
2015_235_1_1,Integration_Report_1 
2015_273_2_1_1,Cab_Calloway_Home_Movie_1 
2015_273_2_2_1,Cab_Calloway_Home_Movie_2 
$ sed -r ':loop;/^[^_]+,/{s/_/ /g;bend};s/_/./;bloop;:end' input.txt 
2015.275.14.1,Siboney by The Tailor Maids 
2015.275.16.1,Louis Armstrong Cant Give You Anything But Love 
2015.275.17.1,Benny Goodman Trio Nice Work Avalon 
2015.275.18.1,Feather On Jazz Jazz In The Concert Hall 
2015.235.1.1,Integration Report 1 
2015.273.2.1.1,Cab Calloway Home Movie 1 
2015.273.2.2.1,Cab Calloway Home Movie 2 

Erläuterung:

  1. Verwendung s/_/./_-. zu ersetzen bis alle _ vor , wurden ersetzt, was von ^[^_]+, beurteilt wird;
  2. dann, wenn ^[^_]+, Streichhölzer verwenden s/_/ /g all _- nach ,
Verwandte Themen