So ändern Sie eine bestimmte Spalte mit sed oder awk basierend auf einem bestimmten Muster

So ändern Sie eine bestimmte Spalte mit sed oder awk basierend auf einem bestimmten Muster

Ich habe eine CSV-Datei, die so aussieht:

c1,c2,c3,http://aaa.com/blblbblb\nhttp://bbb.com/sdsdsds\nhttp://ccc.com\nhttp://foo.com/ghghghgh

cc1,cc2,cc3,http://eee.com/blblbblb\nhttp://foo.com/sdsdsds\nhttp://fff.com\nhttp://ttt.com/ghghghgh

ccc1,ccc2,ccc3,http://foo.com/blblbblb\nhttp://vvv.com/sdsdsds\nhttp://foo.com/nmnmnmnm\nhttp://qqq.com\nhttp://kkk.com/ghghghgh

ist es möglich, die obige CSV-Datei zu bearbeiten und wie folgt zu exportieren: (mit sedoder awkoder ähnlichen Bash-Befehlen)

c1,c2,c3,http://foo.com/ghghghgh 

cc1,cc2,cc3,http://foo.com/sdsdsds

ccc1,ccc2,ccc3,http://foo.com/blblbblb;http://foo.com/nmnmnmnm

Eigentlich möchte ich nur die vierte Spalte und das verbleibende http://foo.com/{some string}Muster manipulieren (mit anderen Worten, Links aus der vierten Spalte extrahieren, wenn sie die Domäne foo.com enthalten).

Antwort1

sed '
    s|http://foo.com|@|g #replace `foo.com` domain with rare symbol
    /./s/\\n\|$/;/g      #replace `\n` by `;`  and add it to end 
    s/http[^@]*;//g      #remove all domain(s) without `foo.com`
    s|@|http://foo.com|g #place `foo.com` back
    s/;$//               #remove `;` from the end of line
    ' csv.file

Antwort2

Sie können Folgendes tun:

cat your_csv.csv | sed 's/\\n/,/g' | cut -d ',' -f 4

sedändert alle \ns in ,und cutwählt das vierte Feld, wenn das Trennzeichen,

verwandte Informationen