第一天處理Perl和已經封鎖:)如何只有新的和/或更新的行插入到另一個文件
這裏的情況:一個文件在文件夾中的更新,但也存在於文件夾B,C & D,爲了使它更容易,它們在所有這些中可以不同,所以我不能只是做一個差異。 意圖複製到其他文件的新行由標誌標識,例如#I,在行尾。
更新之前文件看起來是這樣的:
First line
Second line
Fifth line
更新它看起來像在此之後:對
First line
Second line
Third line #I
Fourth line #I
Fifth line
Sixth line #I
我需要做的是搜索「二線」其他文件,插入標有#I的行 - 按照它們插入的順序 - 然後搜索「第五行」並插入「第六行#I」。
在這個例子中,它們都是連續的,但在需要更新的文件中,第一個更新塊和第二個(以及第三個等等)之間可能有幾行。
要更新的文件可以是sh腳本,awk腳本,純文本文件等,腳本應該是通用的。該腳本將有兩個條目參數,更新的文件和要更新的文件。
任何提示如何做到這一點都是受歡迎的。如果需要,我可以提供迄今爲止的代碼 - 關閉但尚未運行。
感謝,
若昂
PS:這裏是我到目前爲止
# Pass the content of the file $FileUpdate to the updateFile array
@updateFile = <UPD>;
# Pass the content of the file $FileOriginal to the originalFile array
@originalFile = <ORG>;
# Remove empty lines from the array contained on the updated file
@updateFile = grep(/\S/, @updateFile);
# Create an array that will contain the modifications and the line
# prior to the first modification.
@modifications =();
# Counter initialization
$i = 0;
# Loop the array to find out which lines are flagged as new and
# which lines immediately precede those
foreach $linha (@updateFile) {
# Remove \n characters
chomp($linha);
# Find the new lines flagged with #I
if ($linha =~ m/#I$/) {
# Verify that the previous line is not flagged as updated.
# If it is not, it means that the update starts here.
unless ($updateFile[$i-1] =~ m/#I$/) {
print "Line where the update starts $updateFile[$i-1]\n";
# Add that line to the array modifications
push(@modifications, $updateFile[$i-1]);
} # END OF unless
print "$updateFile[$i]\n";
# Add the lines tagged for insertion into the array
push(@modifications, $updateFile[$i]);
} # END OF if ($linha =~ m/#I$/)
# Increment the counter
$i = $i + 1;
} # END OF foreach $linha (@updateFile)
foreach $modif (@modifications) {
unless ($modif =~ m/#I$/) {
foreach $original (@originalFile) {
chomp($original);
if ($original ne $modif) {
push (@newOriginal, $originalFile[$n]);
}
elsif ($original eq $modif) { #&& $modif[$n+1] =~ m/#I$/) {
push (@newOriginal, $originalFile[$n]);
last;
}
$n = $n + 1;
}
}
if ($modif =~ m/#I$/) {
push (@newOriginal, $modifications[$m]);
}
$m = $m + 1;
}
得到的結果幾乎是一個我想,但現在還沒有。
因此,您正在更新源'B/file','C/file'和'D/file'的目標'A/file'。源代碼中的新行被標記,並且必須將它們插入到目標中,該行與標記的新行之前的行中的行相同。是對的嗎?這是否可以滿足要刪除的行?如果源中存在多個相同的行,那麼會發生什麼情況,以至於無法確定插入新記錄的位置? – Borodin 2012-03-23 14:27:58
嗨TLP,我已經添加了我到目前爲止。 – 2012-03-23 14:31:31
嗨鮑羅丁,更新流程是相反的。 A /文件將更新B /文件,C /文件和D /文件。原則上不會有多條相同的線條,但我沒有真正想過。也許插入第一個。 – 2012-03-23 14:33:08