【问题标题】:Delete a specific character in txt删除txt中的特定字符
【发布时间】:2021-03-27 00:35:58
【问题描述】:

想象一下我有下一个 txt 格式:

'20201': "a" ,
'20202': "e" ,
'20203': "i" ,
'20204': "o" ,
'20205': "u" ,
'20207': "ae" ,
'20209': "ai" ,
'20210': "ao" 

当它是 0 时,我想擦除四位数。所以预期的输出是:

'2021': "a" ,
'2022': "e" ,
'2023': "i" ,
'2024': "o" ,
'2025': "u" ,
'2027': "ae" ,
'2029': "ai" ,
'20210': "ao" 

我正在考虑这个:

awk -i inplace  ' { for ( i = 1; i <= NF; ++i ) {

    if ( $i == '0')
        r = 1

    
    }
  }}
1 ' example.txt ```
    

【问题讨论】:

  • 在解决方案时不要使用-i inplace(甚至在您的问题中显示)。只需让输出显示到标准输出,直到正确为止。

标签: python awk sed


【解决方案1】:

对于awk,您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。

不带字段分隔符试试:

awk 'substr($0,5,1)==0{ $0=substr($0,1,4) substr($0,6) } 1'  Input_file

或使用字段分隔符尝试以下操作:仅在此处专门处理第一个字段。

awk '
BEGIN{
  FS=OFS=":"
}
substr($1,5,1)==0{
  $1=substr($1,1,4) substr($1,6)
}
1
'  Input_file

如果您对上述命令的输出感到满意,请将输出保存到 Input_file 本身附加 &gt; temp &amp;&amp; mv temp Input_file

说明:为上述添加详细说明。

awk '                             ##Starting awk program from here.
BEGIN{                            ##Starting BEGIN section of this program from here.
  FS=OFS=":"                      ##Setting FS and OFS as colon here.
}
substr($1,5,1)==0{                ##Checking condition if 5th character is 0 then do following.
  $1=substr($1,1,4) substr($1,6)  ##Setting sub string of 1st 4 characters then mentioning characters from 6th character to last of 1st field here.
}
1                                 ##1 will print current line.
' Input_file                      ##Mentioning Input_file name here.

【讨论】:

  • 它没有修改任何东西
  • @Max,是的,我在回答中提到过。 “要将输出保存到 Input_file 本身,一旦您对上述命令的输出感到满意,请附加 ` > temp && mv temp Input_file`。”
【解决方案2】:

对于一个简洁的 GNU sed 解决方案,这是可行的:

sed "s/^\(....\)0/\1/" example.txt

在这里,我们只匹配前 5 个字符——前 4 个是空闲的,第 5 个是零。对于任何匹配项,我们仅将前 5 个字符替换为前 4 个字符。

如果你想修改文件就地,你可以使用sed的-i选项:

sed "s/^\(....\)0/\1/" -i example.txt

(注意-i 将适用于许多但不是所有系统;请参阅解决方法here

【讨论】:

  • 上面的答案简洁地回答了这个问题,但也许sed -E 's/^(.{4})0/\1/' file虽然不是更短,但里程更多。
  • 我没有看到是什么让这个 SED GNU 特定?
【解决方案3】:

如果我的子字符串是一个正数,如果是零则去掉第四位:

sed -e 's/\([0-9][0-9][0-9]\)0/\1/g' file

如果我的word是一个正数,如果是零则去掉第四位:

sed -e 's/\b\([0-9][0-9][0-9]\)0\([0-9]*\)\b/\1\2/g' file

【讨论】:

    【解决方案4】:

    如果您想使用python 作为标记选项,请考虑使用pandas.read_csv 函数以及str.splitstr.replace 方法,然后应用str.join 方法组合每个派生行的每个拆分片段在写入原始文件时,例如

    import pandas as pd
    
    sss=[]
    with open('myfile.txt','r') as f_in:
            data = pd.read_csv(f_in,header=None)        
            for line in data[0]:
                s=line.split()
                j=0
                ss=""
                for i in s[0]:
                    j+=1
                    if j==5: # including the first quote(')
                        if i!='0':
                            ss+=i
                    else:
                        ss+=i
    
                sss.append(line.replace(s[0],ss))                 
    j=0
    ss=""
    with open('myfile.txt','w') as f_out:
        for line in sss:
            j+=1
            ss=''.join(str(line))
            if j==len(sss):
                f_out.write(ss+'\n')
            else:
                f_out.write(ss+',\n')
    

    【讨论】:

      【解决方案5】:

      您可以利用 GNU AWK gensub 来实现以下方式,让 file.txt 内容 是

      '20201': "a" ,
      '20202': "e" ,
      '20203': "i" ,
      '20204': "o" ,
      '20205': "u" ,
      '20207': "ae" ,
      '20209': "ai" ,
      '20210': "ao" 
      

      然后

      awk '{print gensub(/^(....)0/,"\\1",1)}' file.txt
      

      输出

      '2021': "a" ,
      '2022': "e" ,
      '2023': "i" ,
      '2024': "o" ,
      '2025': "u" ,
      '2027': "ae" ,
      '2029': "ai" ,
      '20210': "ao" 
      

      说明:我使用 gensub 的 在替换文本中指定正则表达式组件的能力来指示使用(前 4 个字符)替换(前 4 个字符后跟零)。由于前导 ' 表示第 4 个数字是第 5 个字符,我们需要获取 4 个第一个字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        相关资源
        最近更新 更多