从特定字段的逗号分隔值中删除单词
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:
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: