如何删除unix中特定多个字段中的括号

时间:2017-08-29 12:14:11

标签: bash shell unix awk

我需要从一行中的特定字段(第2,第4,第5,第7个字段)中删除括号“{”,我尝试使用以下命令但没有帮助

文件中的数据

a,{1},hello{hi}hello,{+2A},{3},un{i}x,{4}

期望的输出

a,1,hello{hi}hello,+2A,3,un{i}x,4

尝试过unix命令

awk -v FS="," -v OFS="," 'BEGIN { split("2,4,5,7", F); } { for(N in F) sub("\\(\\)","", $(F[N])) }1' testfile | sed 's/,,/,/g'

5 个答案:

答案 0 :(得分:3)

您可以使用此clean_slug

class FlavorForm(forms.ModelForm):

    def clean_title(self):
        # even if this is a required field, it might be missing
        # Django will check for required fields, no need to raise
        # that error here, but check for existence
        title = self.cleaned_data.get('title', None)
        if title and not value.startswith('Tasty'):
            msg = 'Must start with Tasty'
            raise ValidationError(msg):
        return title

    class Meta:
        model = Flavor
        fields = ['title', 'slug', 'scoops_remaining']

<强>输出:

awk

答案 1 :(得分:2)

awk 解决方案:

awk -F, '{ for(i=1;i<=NF;i++) if(i~/^(2|4|5|7)$/) gsub(/[}{]/,"",$i) }1' OFS=',' file
  • i~/^(2|4|5|7)$/ - 如果字段编号与备用组中的任何项目匹配

输出:

a,1,hello{hi}hello,+2A,3,un{i}x,4

答案 2 :(得分:1)

尝试一次。

awk -F, '{for(i=1;i<=NF;i++){if((i==2||i==5||i==4||i==7) && (($i ~ /\}/) ||($i ~ /\{/))){gsub(/{|}/,"",$i);}}} 1' OFS=,   Input_file

编辑:此处也添加非单一形式的解决方案。

awk -F, '{
for(i=1;i<=NF;i++){
  if((i==2||i==5||i==4||i==7) && (($i ~ /\}/) ||($i ~ /\{/))){
    gsub(/{|}/,"",$i)
}}}
1
' OFS=,   Input_file

EDIT1:如果你想删除)也只考虑相同的字段编号,你可以在上面的代码中进行小编辑。

awk -F, '{
for(i=1;i<=NF;i++){
  if((i==2||i==5||i==4||i==7) && (($i ~ /\}/) ||($i ~ /\{/))){
    gsub(/{|}|)/,"",$i)
}}}
1
' OFS=,   Input_file

答案 3 :(得分:1)

主要是为了保持perl技能稍微磨练(每6个月左右你需要在perl中做一些事情!)

perl -F, -lane '$,=","; $F[$_ - 1]=~s/[{}]//g foreach(2,4,5,7); print @F;' input-file

答案 4 :(得分:0)

awk -v FS="," -v OFS="," 'BEGIN { split("2,4,5,7", F, ","); } { for(N in F) {gsub(/[}{]/,"", $(F[N]))} }1'