3

我有一个有五列的文件。

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

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

预先感谢您的帮助。

4

6 回答 6

4

awk 是一个更好的选择:

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

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

于 2013-06-10T13:49:29.530 回答
3

GNU sed

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

..输出:

1111 1111 exm-IND1-200449980 II
1111 1111 exm-IND1-201453487 I 0
1111 1111 exm-IND1-85310248 II
1111 1111 exm-IND10-102817747 DD
1111 1111 exm-IND10-18329639 0 D
1111 1111 exm-IND10-27476467 II
1111 1111 exm-IND10-27727540 D 0
于 2013-06-10T14:12:16.347 回答
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
于 2013-06-10T14:20:04.753 回答
2
awk '{gsub(/-/,"0",$4);gsub(/-/,"0",$5)}1' test.in | column -t

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

于 2013-06-10T13:53:22.527 回答
1

awk

awk '$4=="-"{$4=0}$5=="-"{$5=0}1' inputFile
于 2013-06-10T13:49:33.370 回答
-1

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

file1 = [line.strip().split() for line in open('file1')]
for line in file1:
    line[2] = line[2].replace('-','')
print file1
于 2013-06-10T13:52:27.777 回答