Dateiinhalt verdoppeln

I

ib0b

Grünschnabel
Hallo,

ich möchte den Inhalt einer Datei verdoppeln, Kopf- und Endesatz ausgenommen.
Danach muss im Endesatz die Datensatzanzahl angepasst werden (verdoppelt werden).
Leider liegt meine aktive Unix Zeit lange in der Vergangenheit und ohne Hilfe schaffe ich das nicht.
Schon mal vielen Dank vorab!

Quelldatei:
Kopfsatz A*
Zeile 1
Zeile 2
Zeile 3
...
Zeile N
Endesatz Z*

Zieldatei:
Kopfsatz A*
Zeile 1
Zeile 2
Zeile 3
...
Zeile N
Zeile 1
Zeile 2
Zeile 3
...
ZeileN
Endesatz Z* (Neuer Satzzähler Stelle 67-81 = alter Satzzähler * 2)

Die Datei hat eine Größe von ca. 350MB und ca. 500Tsd Zeilen.

Danke & Gruß
Boris
 
Du könntest sowas wie "+yGGp" in eine Datei schreiben und damit vim via -s auf Dein Ursprungsfile loslassen.
 
Code:
#!/usr/bin/gawk -f

# aufruf mit scriptname.awk quelldatei zieldatei


doExit=0
function usage(   doexit) {
 print "scriptname quelldatei zieldatei"
 doExit=1
 exit
}

BEGIN {
 if (ARGC != 3) {
   print "Falsche Parameteranzahl"
   usage()
 }

 if (ARGV[1] == ARGV[2] ) {
   print "Fehler: Namen von Quelle und Ziel identisch"
   usage()
 }

 ARGV[3] = ARGV[2];   # quelle brauchen wir zweimal frü zweiten durchlauf
 ARGV[2] = ARGV[1];
 ARGC++;              # sonst geht 2. durchlauf nicht

 print "Sourcedatei: " ARGV[1]  # name der quelldatei als argument angeben
 fn_ziel=ARGV[3];
 print "Zieldatei  : " fn_ziel

 ctr_first_run= 0;
 ctr_2nd_run= 0;
}

# 1. Lauf
NR == FNR {
  if ( (NR>=1) && (NF > 1)) { 
    print $0 > fn_ziel
  }
  if ( (NR>1) && (NF > 1)) { 
    ctr_first_run++;
  }
  next
}


{ # 2. lauf
    if (FNR>1 && NF > 1) { 
      print $0 > fn_ziel
      ctr_2nd_run++;
  }
}

END {
  if (doExit) { exit };
  print "Summe der Zeilen im 1. durchlauf:" ctr_first_run;
  print "Summe der Zeilen im 2. durchlauf:" ctr_2nd_run;
  if (ctr_first_run != ctr_2nd_run ) { print "Fehler! Ungleiche ctr-Werte"; }
  print ctr_first_run+ctr_2nd_run > fn_ziel;
}
 
in Perl:
Code:
#!/usr/bin/perl 
use strict;
use warnings;

my $fn_quelle = "quelle.txt";
my $fn_ziel     = "ziel.txt";

my $ctr_1st_step=-1; # weil wir die kopfzeile mit schreiben aber das kein datensatz ist also mit 1 weniger anfangen zu zählen
my $ctr_2nd_step=0;

open(my $ifh, "<", $fn_quelle) or die ("kann datei $fn_quelle nicht öffnen");
open(my $ofh, ">", $fn_ziel) or die ("kann datei $fn_ziel nicht öffnen");

# 1. step
my $zeile;
while ($zeile = <$ifh>) {
 # checken ob letzte Zeile auf irgendein pattern wie: Zahlen + \n
 if ($zeile =~ /^[0-9]+$/) {
   last;
 }
 else {
   $ctr_1st_step++;
   print $ofh $zeile;
 }
}

print "ende 1 step\n";
print "ctr_1st_step:" . $ctr_1st_step . "\n";

#2 step
seek $ifh,0,0; #dateizeiger der quelldatei wieder auf angang

my $z1 = <$ifh>; # 1. Zeile wegwerfen
while ($zeile = <$ifh>) {
 # checken ob letzte Zeile auf irgendein pattern wie: Zahlen + \n
 if ($zeile =~ /^[0-9]+$/) {
   last;
 }
 else {
   $ctr_2nd_step++;
   print $ofh $zeile;
 }
}
print $ofh ($ctr_1st_step + $ctr_2nd_step);

close $ifh;
close $ofh;
 

Ähnliche Themen

Mit AWK verschiedene Felder verschiedener Zeilen vergleichen

Spalten einer Datei in neue Datei integrieren.

[gelöst] - for file in ... nur für bestimmte Endungen?

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Zurück
Oben