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

时间:2016-10-12 04:33:46

标签: awk sed text-processing

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:

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

如果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

答案 2 :(得分:0)

这可能适合你(GNU sed):

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

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

答案 3 :(得分:0)

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

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