• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Formatierte Ausgabe mit awk

fh2k6

Newbie
Tag Leute,

bin Neuling in der Linux- und Skriptwelt und stehe vor einem Problem.

Meine Input Datei sieht folgendermaßen aus:

6829 6831 6832 6833 6834 6835 6836 6837 6838 .....

Nun möchte ich mit awk diese Spalten formatiert in eine andere Datei schreiben, beispielsweise so:

{ printf "%10d%10d%10d%10d%10d%10d%10d%10d\n", $1, $2, $3, $4, $5, $6, $7, $8 }

Da in der Ausgangsdatei jede Menge und niemals gleich viele Spalten sind, möchte ich die Zeilen immer bis zur achten Spalte auffüllen lassen, einen Zeilenumbruch machen und dann die nächste Zeile auffüllen.

Das Ganze soll dann so aussehen:

6829 6831 6832 6833 6834 6835 6836 6837
6838 6839 6840 6841 6842 6843 6844 6845
......... ..........

Hoffe ihr könnt mir hier helfen
 
OP
F

fh2k6

Newbie
Ja, das funktioniert, aber das Augabeformat muss für jede Spalte genau 10 Zeichen breit sein.
 
OP
F

fh2k6

Newbie
in der Datei brauche ich folgendes Format:

______2135______2332______3235______3232______2135______2332______3235______3232

wobei die Tiefstriche für Leerzeichen stehen.
 

TeXpert

Guru
hmm, sowas musste ich noch nicht mit awk machen :) aber ich würde das so wie in jeder anderen Sprache machen:

drucke die Felder einzeln und erst wenn die max-Anzahl pro Zeile erreicht ist einen Zeilenumbruch... und das ganze bis zum ende der Zeile.

END
Code:
{ CUR = 1
  while (CUR <= NF) {
    printf "%10d", $CUR
    if ((CUR%8) == 0) {
      print ""
    }
    CUR++
  }
  print ""
}

wenn mehrere zeilen zusammengefasst werden sollen (so dass immer 8 Zaheln/Zeile stehen, musst Du mit einer globalen Variablen (in BEGIN initialisieren) arbeiten und etsprechend cur manipulieren
 
OP
F

fh2k6

Newbie
zunächst vielen Dank für die bisherige Hilfe :!:

habe mir folgendes zusammen basteln können:
Code:
i=0
for zahl in `cat datei.tmp`
do
       if [ $i == 8 ]
       then
                       i=0
                       echo "" >> "d3hsp_4.tmp"
       fi
printf "%6s"$zahl>> "d3hsp_4.tmp" 
i=`expr $i + 1`
done
das Problem was jetzt noch besteht ist, dass die Zahlen die übernommen werden nicht immer vierstellig sind, die Spalte insgesamt aber 10 Zeichen breit sein muss und somit die Lösung mit %6s nicht in Betracht kommt.
%10d was in einem anderen Skript funktioniert hat, geht hier einfach nicht.
 
OP
F

fh2k6

Newbie
ich nochmal,

mein Betreuer ist der Meinung das die Sache komplett mit awk abgehandelt werden muss. Deswegen nochmal die Bitte an jemanden der die Sache mit awk beherrscht.

im Moment sieht mein Skript folgendermaßen aus:
Code:
#!/bin/sh


awk '

BEGIN {

            
           anzahl_nodes = 0

      }
{

 if (($1 == "penetrating") && ($2 == "node"))
    {
     anzahl_nodes=anzahl_nodes+1
     node_id[anzahl_nodes] = $5
     zeile_segment=NR
     zeile_segment+=5
     }
 if (zeile_segment == NR)
    {
     segment[anzahl_nodes,1]=$1
     segment[anzahl_nodes,2]=$2
     segment[anzahl_nodes,3]=$3
     if ($4=="") {segment[anzahl_nodes,4]=$3}
     if ($4!="") {segment[anzahl_nodes,4]=$4}
    }

}

END {

     print "*SET_NODE_LIST" > "sets.tmp"
     print "$#     SID       DA1       DA2       DA3       DA4" >> "sets.tmp"
     print "    999998        0.        0.        0.        0." >> "sets.tmp"
     print "$#    NID1      NID2      NID3      NID4      NID5      NID6      NID7      NID8" >> "sets.tmp"
     
      for (i=1;i<=anzahl_nodes;i++)

         {          
         
         printf "%10d",node_id[i] >> "sets.tmp"
           
	 }  
         
     print "*SET_SEGMENT" >> "sets.tmp"
     print "$#     SID       DA1       DA2       DA3       DA4" >> "sets.tmp"
     print "    999999        0.        0.        0.        0." >> "sets.tmp"
     print "$#    NID1      NID2      NID3      NID4" >> "sets.tmp"
     
     for (i=1;i<=anzahl_nodes;i++)
        {
	 printf "%10d%10d%10d%10d\n",segment[i,1],segment[i,2],segment[i,3],segment[i,4] >> "sets.tmp"
	
	}

    printf "*END" >> "sets.tmp"

    }
    

   ' $1


grep -v "*END" $2 > model.tmp

cat model.tmp sets.tmp > $3

an der Stelle des ersten PRINTF Befehls muss die Ausgabe immer 8 Spalten auffüllen und dann in die nächste Zeile springen.

Ich bekomm´s einfach nicht hin!
 

TeXpert

Guru
*was zum henker* stört Dich an meiner Lösung? die gibt jeden Zahlenblock sauber auf 10Stellen gepadded immer 8 Blöcke/Zeile aus... wenn Du den Code nicht verstehst, dann kann sag das...

aber was soll Dein Quältext denn jetzt bedeuten...

sollen das hier:

Code:
print "*SET_NODE_LIST" > "sets.tmp"
     print "$#     SID       DA1       DA2       DA3       DA4" >> "sets.tmp"
     print "    999998        0.        0.        0.        0." >> "sets.tmp"
     print "$#    NID1      NID2      NID3      NID4      NID5      NID6      NID7      NID8" >> "sets.tmp"
Debug-Ausgaben werden?


diese Lösung hier:

Code:
{ CUR = 1
  while (CUR <= NF) {
    printf "%10d", $CUR
    if ((CUR%8) == 0) {
      print ""
    }
    CUR++
  }
  print ""
}

ist _reiner_ awk-Code...

also rein in eine Datei und dann ab durch die Mitte... aber ich vermute, dass das Dich etwas überfordert...

also hier mal langsam zum mitschreiben:

Code:
$ cat data
1 12 123 1234 12345 123456 1234567 12346578 1234567 123456 12345 1234 123 12 1 1 12 123 1234 12345 123456 1234567 12346578 1234567 123456 12345 1234 123 12 1 1 12 123 1234 12345 123456 1234567 12346578 1234567 123456 12345 1234 123 12 1 1 12 123 1234 12345 123456 1234567 12346578 1234567 123456 12345 1234 123 12 1
$
$ cat prettyprint.awk
{ CUR = 1
  while (CUR <= NF) {
    printf "%10d", $CUR
    if ((CUR%8) == 0) {
      print ""
    }
    CUR++
  }
  print ""
}
$
$ awk -f prettyprint.awk data
         1        12       123      1234     12345    123456   1234567  12346578
   1234567    123456     12345      1234       123        12         1         1
        12       123      1234     12345    123456   1234567  12346578   1234567
    123456     12345      1234       123        12         1         1        12
       123      1234     12345    123456   1234567  12346578   1234567    123456
     12345      1234       123        12         1         1        12       123
      1234     12345    123456   1234567  12346578   1234567    123456     12345
      1234       123        12         1
$

data mit einer Zeile, wenns mehr sind & die Blöcke zeilenübergreifend zusammengefasst werden sollen mit globaler-Count-Variable arbeiten...
 
OP
F

fh2k6

Newbie
Hi Tex,

klar hab ich´s nicht kapiert, mache den Kram halt zum ersten Mal.

Werde es gegen Abend nochmal anhand deiner Anleitung probieren.

Vielen Dank
 
Oben