修改固定列的数据

修改固定列的数据

文件格式大致如下:
000001|ZINC|0301001|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000002|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000003|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301006|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000005|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301009|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000007|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301010|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000008|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000001|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|
000009|ZINC|0301000|0|200808|JMJC001|20080911111111|abcdef|12345678900|1|9|

现在想把第3列的内容都换掉,该如何做?我做了个如下,哪位能帮忙改个简单点的.
#!/bin/usr/perl -w


use strict;

$^I = ".bak";
while(<>)
{
    my @line = split /\|/, $_;
    $line[2] = "030100048";
    $_ = join "|" @line;

    print ;
}
已经很简单了。。。


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl -w

use strict;

$^I = ".bak";
my $txt = '030100048';
while (<>) {
    s/^(\w+\|\w+\|)(\w+)/$1$txt/;
    print;
}

perl -i.bak -ple 'substr($_,12,7)="030100048"' urfile
perl -i.bak -pe 's/((?:.*?\|){2})(?:.*?\|)/${1}030100048|/' urfile
刚开始看perl语言入门第四版第9章了. 先来消化下各位的代码,谢谢楼上的各位!
想问下flw, 前面两列的长度可能不一定相同,第3列也有可能不是每行固定的长度. 这个就用不了了吧.
方法很多,根据情况灵活运用


QUOTE:
原帖由 ynchnluiti 于 2008-11-7 18:45 发表
方法很多,根据情况灵活运用

恩, 你的那个现在看懂了,5楼的那个还没怎么看懂.
perl -i.bak -F'/\|/' -lane '$,="|";print @F[0..1],"030100048",@F[3..$#F]'  urfile

其实跟楼主的原理一样