我需要用一系列值替换特定的Field条目。
假设以下是我拥有的文件集
file1.txt
file2.txt
file3.txt
和file1.txt包含以下条目>>
LOI 0403 001900 0000 0100 001 001 000030 000000 00000000 000 PF155000087 0000 PROMO55
LOI 0403 001900 0000 0100 001 002 000030 000000 00000000 000 0NF18300061 0000 ON
LOI 0403 002800 0000 0100 002 001 000030 000000 00000000 000 CVCID002100 0000 P41884
LOI 0403 002800 0000 0100 002 002 000030 000000 00000000 000 CVCID002101 0000 PROMO55
LOI 0403 004700 0000 0100 003 001 000100 000000 00000000 000 CVCID002102 0000 VERCAR60
LOI 0403 011900 0100 0100 001 001 000100 000000 00000000 000 CVCID002103 0000 VERCAR60
LOI 0403 012800 0100 0100 002 001 000030 000000 00000000 000 CVCID002104 0000 VOD88
我需要替换第12场中有PF155000087,0NF18300061,CVCID002100等的参赛作品。
类似的条目也将在file2.txt和file3.txt中提供。
上述条目必须分别替换为ABCDE000001,ABCDE000002,ABCDE000003,ABCDE000004等一系列条目。
成功替换file1.txt后,序列应继续为file2.txt。例如,如果file1.txt上的结束值是ABCDE000030,则开始替换file2.txt应该来自ABCDE000031,依此类推......
任何人都可以帮我解决上述问题。
提前致谢!
答案 0 :(得分:0)
perl -i -lane '$F[11] = sprintf("ABCDE%06d", ++$i); print "@F"' file1.txt file2.txt ..
答案 1 :(得分:0)
这是一个相当冗长的解决方案,它使用File::Temp
执行相当于就地编辑的工作。它将修改后的数据写入临时文件,删除原始文件,并将临时文件重命名为原始输入的名称。
这大致与perl命令行上的-i
选项(以及相应的$^I
变量)完全相同,但在Windows平台上无法在没有备份文件的情况下进行编辑,因此此代码可能对某人有用。
use strict;
use warnings;
use autodie;
use File::Temp qw/ tempfile /;
for my $file (qw/ file1.txt /) {
open my $in_fh, '<', $file;
my ($temp_fh, $temp_name) = tempfile;
while (<$in_fh>) {
my @fields = split;
$fields[11] = sprintf 'ABCDE%06d', $.;
print $temp_fh "@fields\n";
}
close $temp_fh;
close $in_fh;
unlink $file;
rename $temp_name, $file;
}
<强>输出强>
LOI 0403 001900 0000 0100 001 001 000030 000000 00000000 000 ABCDE000001 0000 PROMO55
LOI 0403 001900 0000 0100 001 002 000030 000000 00000000 000 ABCDE000002 0000 ON
LOI 0403 002800 0000 0100 002 001 000030 000000 00000000 000 ABCDE000003 0000 P41884
LOI 0403 002800 0000 0100 002 002 000030 000000 00000000 000 ABCDE000004 0000 PROMO55
LOI 0403 004700 0000 0100 003 001 000100 000000 00000000 000 ABCDE000005 0000 VERCAR60
LOI 0403 011900 0100 0100 001 001 000100 000000 00000000 000 ABCDE000006 0000 VERCAR60
LOI 0403 012800 0100 0100 002 001 000030 000000 00000000 000 ABCDE000007 0000 VOD88
答案 2 :(得分:0)
尝试做这样的事情
echo $(awk '{print $12}'> *.txt > string_to_replace.txt)
while read -r u3 line1; read -r -u4 line2;
do echo "$line1:$line2"
sed -i -e "s/$line1/$line2/g" file*.txt
done 3< string_to_replace.txt 4< String_replacement.txt