Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找和替换特定列中的破折号的步骤_Python_Linux_Sed_Awk - Fatal编程技术网

Python 查找和替换特定列中的破折号的步骤

Python 查找和替换特定列中的破折号的步骤,python,linux,sed,awk,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

我有一个有五列的文件

文件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是一个更好的选择:

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

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

使用
awk

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

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

file1 = [line.strip().split() for line in open('file1')]
for line in file1:
    line[2] = line[2].replace('-','')
print file1
是为了保持良好的格式,如果不需要,可以将其删除。

GNU-sed …输出:

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 1111111 exm-IND1-200449980 I 1111111 exm-IND1-201453487 I 0 1111111 exm-IND1-85310248 I 1111111 exm-IND10-102817747 D 1111111 exm-IND10-18329639 0 D 1111111 exm-IND10-27476467 I 1111111 exm-IND10-27727540 D 0 这就是你想要的:

$ 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

我肯定认为
awk
更适合这个…如果你有一个包含5列的文件,那么第6列是从哪里来的?第4列和第5列,我道歉。我已经相应地编辑了这个问题。例如,这将在第二行的第四列中用0替换
I
,并且您没有处理输出上的字段分隔。谢谢大家。更新了解决方案。 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
$ 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