ich eine Datei haben, die unten Mustergeteilt eine Datei basierend auf einem Muster
HDR1|20160101|1234|
N1|ABC|
XXX|21431415|3522352352|ITEM|
FORE|20140508|20140214|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
FORE|20140508|20140214|
SD|0|0039 - data|data|data|data|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
möchte ich teilen Sie die Datei auf eine Größe basierend haben würde, aber auch um die unten nehmen müssen.
Die ersten 3 Zeilen ist die Kopfzeile, die ich in jede von mir erstellte Split-Datei aufnehmen muss. Die Zeile, die mit FORE beginnt, hat ihre unteren Zeilen, beginnend mit SD, also muss ich sie alle zusammenhalten.
Die Ausgabe sollte wie folgt aussehen.
Split File 1:
HDR1|20160101|1234|
N1|ABC|
XXX|21431415|3522352352|ITEM|
FORE|20140508|20140214|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
Split File 2:
HDR1|20160101|1234|
N1|ABC|
XXX|21431415|3522352352|ITEM|
FORE|20140508|20140214|
SD|0|0039 - data|data|data|data|
SD|0|0039 - data|data|data|data|
SD|0|0211 - data|data|data|data|
ich einen Pseudo-Code aufgebaut haben, die wie below.There aussieht, kann mehrere Sätze solcher FORE und SD sein, die ich Ich habe eine Schleife gelegt
create $file
create $line_num=5
create $file_size
create $top_size=20mb
read the first 4 lines of the original file and copy it in a temphdr file
Loop until last $line_num is encountered
read the header details and Append the header from the temphdr to the $file
for each $record starting the head -$line_num (5,6,7...etc) that contains FORE| in the first part
if the $file size is < $top_size
append the $record in the $file
increment $line_num
For each $record in head -$line_num that contains SD| in the first part
append the $record in the $file
increment $line_num
else
create a $file=$file+1
fi
end loop
end loop
Könnte jemand mich wissen lassen, wenn es irgendeinen anderen Effekt gibt Eine andere Möglichkeit, awk und sed usw. zu verwenden, um dies anders als die oben erwähnte Logik auf hoher Ebene zu implementieren.
Ich bemerke Ihre letzte Bearbeitung - haben Sie einen Grund zu glauben, dass meine Antwort * nicht das tut, wonach Sie fragen (re: Split nur bei einer FORE, behalten Sie es als Set mit den folgenden SDs)? –
Hey Charles. Das tut mir leid. Irgendwie habe ich es anfangs gar nicht bemerkt, also habe ich meine Frage bearbeitet und gedacht, dass ich vielleicht nicht ausgearbeitet habe, aber dann habe ich sofort bemerkt, dass du meinen Punkt bereits berücksichtigt hast. :). Ich danke Ihnen dafür. – user3055262
NP. Der einzige Ort, an dem es eine Frage der Interpretation gibt, ist, ob Sie sich bei * jedem * FORE aufteilen wollen (wie @ anubhavas Antwort tut), oder bei der ersten FORE nach einer 20-MB-Grenze (wie meine Antwort tut). –