查找和替换特定列中的短划线

时间:2013-06-10 13:45:03

标签: python linux sed awk

我有一个有五列的文件。

文件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

解决这个问题,但觉得这有些相当笨重。有没有人对这个问题有更简洁的建议?因为我将遇到很多。

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:4)

Awk是一个更好的选择:

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

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

答案 1 :(得分:3)

GNU sed

sed -r ':k;s/-(\s*\S*)$/0\1/g;tk' 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

答案 2 :(得分:2)

awk '{gsub(/-/,"0",$4);gsub(/-/,"0",$5)}1' test.in | column -t

column是为了保持良好的格式,如果你不需要它就可以删除它。

答案 3 :(得分:2)

这就是你想要的:

$ 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

答案 4 :(得分:1)

使用awk

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

答案 5 :(得分:-1)

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

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