2014-04-04 49 views
0

我需要用一系列值替換特定的字段條目。嘗試用一系列值替換一組文件中的特定列

以下假設的設定文件的,我有

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

看一看[這裏](http://stackoverflow.com/questions/21675773/reading- CSV文件,在-的Perl/21676782)​​。嘗試編寫一些東西。如果您遇到問題,請將該代碼添加到此問題中。 –

回答

0
perl -i -lane '$F[11] = sprintf("ABCDE%06d", ++$i); print "@F"' file1.txt file2.txt .. 
+0

據我可以告訴OP想要在原地編輯的文件。這會正確進行更改,但會將單個流中的所有輸出發送到STDOUT。 – Borodin

+0

好的。我建議忽視聲譽系統,並盡力寫出好的答案。這樣更符合實際。 – Borodin

+0

是的,和鮑羅丁說過的一樣。此外,不提供每個文件名作爲File1.txt File2.txt提供的文件作爲* .txt讀取所有文件 – TestBud

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 
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 
+0

是的,我錯過了awk中的* txt。謝謝 – TestBud

相關問題