【问题标题】:To find and replace dashes in specific column在特定列中查找和替换破折号
【发布时间】:2013-06-06 04:46:03
【问题描述】:

我有一个包含五列的文件。

文件 1 看起来像:

1111    1111    exm-IND1-200449980  I   I

1111    1111    exm-IND1-201453487  I   -

1111    1111    exm-IND1-85310248   I   I

1111    1111    exm-IND10-102817747 D   D

1111    1111    exm-IND10-18329639  -   D

1111    1111    exm-IND10-27476467  I   I

1111    1111    exm-IND10-27727540  D   -

我想摆脱-,但仅限于第4 列和第5 列,并在这些情况下将- 替换为0。我一直在使用以下代码行:

sed '/^\([^\t]*\t[^\t]*\t[^\t]*\)\t-\t-\(.*\)/ s//\1\t0\t\2/' file1 > newfile

解决这个问题,但觉得这有点笨拙。有没有人对这个问题有更简洁的建议?因为我会经常遇到它。

提前感谢您的帮助。

【问题讨论】:

  • 我绝对认为awk 会更适合这个...
  • 如果你的文件有 5 列,那么第 6 列是从哪里来的?
  • 第 4 列和第 5 列,我很抱歉。我已经相应地编辑了问题。

标签: python linux sed awk


【解决方案1】:

Awk 是一个更好的选择:

awk '{sub("-","0",$4); sub("-","0",$5); print}'

(更新以反映您更新的问题)

【讨论】:

    【解决方案2】:

    GNU sed

    sed -r ':k;s/-(\s*\S*)$/0\1/g;tk' file
    

    ..输出:

    1111 1111 exm-IND1-200449980 我 1111 1111 exm-IND1-201453487 I 0 1111 1111 exm-IND1-85310248 1111 1111 exm-IND10-102817747 D D 1111 1111 exm-IND10-18329639 0 D 1111 1111 exm-IND10-27476467 1111 1111 exm-IND10-27727540 D 0

    【讨论】:

      【解决方案3】:
      awk '{gsub(/-/,"0",$4);gsub(/-/,"0",$5)}1' test.in | column -t
      

      column是为了保持美观的格式,不需要的可以去掉。

      【讨论】:

        【解决方案4】:

        这就是你想要的:

        $ awk '$4=="-"{$4=0}$5=="-"{$5=0}{$1=$1}1' OFS='\t'  file
        1111    1111    exm-IND1-200449980      I       I
        
        1111    1111    exm-IND1-201453487      I       0
        
        1111    1111    exm-IND1-85310248       I       I
        
        1111    1111    exm-IND10-102817747     D       D
        
        1111    1111    exm-IND10-18329639      0       D
        
        1111    1111    exm-IND10-27476467      I       I
        
        1111    1111    exm-IND10-27727540      D       0
        

        【讨论】:

          【解决方案5】:

          awk

          awk '$4=="-"{$4=0}$5=="-"{$5=0}1' inputFile
          

          【讨论】:

          • 这会将I 替换为第二行第四列中的 0,例如,您没有处理输出中的字段分隔。
          • 谢谢各位。更新了解决方案。
          【解决方案6】:

          在 Python 中,您可以执行以下操作:

          file1 = [line.strip().split() for line in open('file1')]
          for line in file1:
              line[2] = line[2].replace('-','')
          print file1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-08
            • 2012-05-13
            相关资源
            最近更新 更多