blob: f174b9cae60356d5eed34bfed5e95b82f4bf9ca5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#! /usr/bin/perl -w
#/*@@
# @file mergeCarpetIOScalar.pl
# @date Tue 15 August 2006
# @author Thomas Radke
# @desc
# Perl script to merge CarpetIOScalar output files,
# eliminating duplicate timesteps.
#
# Source code comments also by Thomas Radke :-)
# @enddesc
#@@*/
if (@ARGV) {
print "\n" .
" This script can be used to merge CarpetIOScalar output written\n" .
" before and after recovery.\n" .
" It reads from STDIN the contents of one or more files\n" .
" in CarpetIOScalar format and writes them to STDOUT again,\n" .
" eliminating duplicate timesteps.\n\n" .
" Example: cat alp.norm1.asc | $0 > alp.norm1.asc.merged\n\n";
exit;
}
# Skalar-Variable zur Speicherung der aktuellen Zeilennummer
my $line = 0;
# Rauten-Feld zur Speicherung der bereits ausgegebenen Datensaetze
my %timesteps = ();
# lese die naechste Zeile von der Standard-Eingabe, solange das Dateiende
# nicht erreicht ist
while (<STDIN>) {
# aktualisiere die Zeilennummer
$line++;
# vergleiche die aktuelle Zeile mit dem Format fuer eine Datenzeile
if (/^(\d+) /) {
# ermittle die Iterationsnummer aus der Datenzeile
my $iteration = $1;
# pruefe im Rauten-Feld, ob dieser Datensatz bereits ausgegeben wurde
while (defined $timesteps{$iteration}) {
# lies alle folgenden Zeilen von der Standard-Eingabe
# bis zur Datenzeile des naechsten Datensatzes
while (<STDIN>) {
$line++;
next unless (/^(\d+) /);
$iteration = $1;
last;
}
}
# vermerke im Rauten-Feld, dass dieser Datensatz ausgegeben wurde
$timesteps{$iteration} = 1;
}
# gib die aktuelle Zeile auf der Standard-Ausgabe aus
print;
}
|