Python 查找和替换特定列中的破折号的步骤
我有一个有五列的文件 文件1看起来像: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
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