从特定字段的逗号分隔值中删除单词

Remove word from a comma separated values of specific field

NIS 组文件的格式为

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

: 作为分隔符,需要从第 4 列中删除确切的单词(例如 rat)。单词的任何前导或尾随 , 也应删除,以保留第 4 列中的逗号分隔值格式

预期输出:

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

您最好使用 awk 来完成这项工作。试试这个(GNU awk):

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

使用 : 作为字段分隔符,gsub 删除第 4 个字段中的所有 rat\y 用于单词边界,因此 rat 将匹配但不匹配 rrat

如果perl解决方案没问题:

修改样本输入以添加更多相关案例..

$ 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:: 上拆分输入行并保存到 @F 数组
  • (@a) = split/,/,$F[3], 上拆分第 4 列并保存到 @a 数组
  • $F[3] = join ",", grep { $_ ne "rat" } @a 删除 @a 数组中与 rat 完全匹配的元素,将这些元素与 , 连接并修改输入行的第 4 个字段
  • print join ":", @F 打印由 :
  • 连接的修改后的 @F 数组元素


打高尔夫球避开临时数组 @a

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


在第 4 列使用正则表达式:

$ 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

这可能对你有用 (GNU sed):

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

删除一个或多个单词 rat 后跟一个可能的 ,

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

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