2016-10-12 5 views
1

Die NIS Gruppe Datei hat FormatEntfernen Wort von einem Komma getrennten Werten von bestimmtem Feld

group1:*:100:bat,cat,zat,ratt 
group2:*:200:rat,cat,bat 
group3:*:300:rat 

Mit : als Trennzeichen müssen genau das Wort entfernen (zB rat) aus der 4. Spalte. Alle führenden oder , dem Wort Hinter sollte auch gelöscht werden durch Komma getrennte Werte Format in der 4. Spalte

Erwartete Ausgabe zu erhalten:

group1:*:100:bat,cat,zat,ratt 
group2:*:200:cat,bat 
group3:*:300: 

Antwort

1

Wenn perl Lösung in Ordnung ist:

Modified Abtastwerteingang relevanter Fälle hinzuzufügen ..

$ cat ip.txt 
group1:*:100:bat,cat,zat,ratt 
group2:*:200:rat,cat,bat 
group3:*:300:rat 
group4:*:400:mat,rat,sat 
group5:*:500:pat,rat 

$ perl -F: -lane '(@a) = split/,/,$F[3]; $F[3] = join ",", grep { $_ ne "rat" } @a; print join ":", @F' ip.txt 
group1:*:100:bat,cat,zat,ratt 
group2:*:200:cat,bat 
group3:*:300: 
group4:*:400:mat,sat 
group5:*:500:pat 
  • -F: geteilte Eingangsleitung auf : und
  • - @F Array speichern
  • (@a) = split/,/,$F[3] Split 4. spalte auf , und speichere auf @a array
  • $F[3] = join ",", grep { $_ ne "rat" } @a Elemente in @a Array entfernen genau rat passend, diese Elemente mit , verbinden und 4. Bereich der Eingangsleitung
  • print join ":", @F Druck die modifizierten @F Arrayelemente verbunden durch :


Golfing modifizieren, um die Temperatur zu vermeiden, array @a

$ perl -F: -lane '$F[3] = join ",", grep { $_ ne "rat" } split/,/,$F[3]; print join ":", @F' ip.txt 


Mit Regex am 4. Spalte:

$ perl -F: -lane '$F[3] =~ s/,rat\b|\brat(,|\b)//g; print join ":", @F' ip.txt 
group1:*:100:bat,cat,zat,ratt 
group2:*:200:cat,bat 
group3:*:300: 
group4:*:400:mat,sat 
group5:*:500:pat 
+0

Sundeep wie kann ich das in Schleife tun, müssen wir 100 Namen aufräumen –

+0

hab es, 'perl -i -F: -lane '(@a) = Split /, /, $ F [3]; $ F [3] = join ",", grep {$ _ne "Ratte"} @a; print join ":", @F 'Gruppe1' –

2

Sie würden eine bessere Nutzung awk für diesen Job. Versuchen Sie, diese (GNU awk):

awk 'BEGIN {OFS=FS=":"} {gsub (/\yrat,?\y|\y,?rat\y/, "", $4)}1' file 

Mit : als Feldtrenn gsub alle rat 4. Feld entfernt. \y wird für Wortgrenzen verwendet, so dass rat übereinstimmen, aber nicht rrat.

+1

@Sundeep Sie haben Recht. Ich habe bearbeitet. – SLePort

0

Dies könnte für Sie arbeiten (GNU sed):

sed -r 's/\brat\b,?//g' file 

Entfernen eines oder mehrerer Wörter rat durch eine mögliche , gefolgt.

0
awk 'NR>1{sub(/rat,*/,"")}1' file 

group1:*:100:bat,cat,zat,ratt 
group2:*:200:cat,bat 
group3:*:300: 
Verwandte Themen