mikrocontroller.net

Forum: PC-Programmierung AWK Werte aus zwei Zeilen zusammenführen


Autor: Matthias M. (matthiasm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi und guten Abend,

ich brauche Hilfe bei AWK. Es geht um folgende Eingabe:
0x00, 0x1F, 0x7F, 0xE0, 0x80, 0x80, 0x80, 0xC0, 0x7F, 0x1F, 
0x00, 0xC0, 0xF0, 0x18, 0x08, 0x08, 0x08, 0x38, 0xF0, 0xC0,

0x00, 0x00, 0x30, 0x60, 0x40, 0xFF, 0xFF, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x08, 0x08, 0x08, 0xF8, 0xF8, 0x08, 0x08, 0x08,

... 

die Werte aus jeweils der zweiten Zeile sollen hinter den Werten der 
ersten Zeile stehen.

quasi so:

aus ...
0x00, 0x1F, ... 
0x00, 0xC0, ...

wird ...
0x0000, 0x1FC0,

Ich würde dazu gerne AWK verwenden. Kleinere Dinge bekomme ich damit 
hin, hier scheitere ich allerdings...

Vielen Dank für eure Hilfe!

: Verschoben durch Moderator
Autor: Liam Z. (liz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies die Wete ein, also for(i=1;i<=FN;i++)  x[i]=0+$FN und
dann in jeder 2ten Zeile, oder lies die nächste Zeile mit getline ein, 
und gib es kombiniert aus.

Autor: Matthias M. (matthiasm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liam Z. schrieb:
> for(i=1;i<=FN;i++)  x[i]=0+$FN

Das verstehe ich grad leider überhaupt nicht. Die for() Schleife läuft 
alle Zeilen ab und packt mir jede Zeile in das Array x, oder?

Aber ich brauchs ja nicht Zeilenweise sondern Wert für Wert...

getline ist generell eine super Idee, aber auch hier springe ich ja nur 
zur nächsten Zeile. Ich brauch ja immer den jeweiligen Wert aus der 2. 
Zeile und muss dann wieder zurückspringen.

Autor: Liam Z. (liz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danni probier mal folgendes

BEGIN { FS = ","; OFS=","; }
for(i=1;i<=NF;i++) x[i]=$i;
getline;  $0=$0;
for(i=1;i<=NF;i++) $i=$i+"-"+x[i];
print $0;
}

: Bearbeitet durch User
Autor: Matthias M. (matthiasm)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hmm leider auch nicht ganz...

er nullt nun alles.

(siehe Anhang)

Autor: Liam Z. (liz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sollte dir aufzeigen wie es geht, keine fertige Losung, dachte du 
kennst dich etwas aus.
Hier ein funktionierender code.

BEGIN { FS = ","; OFS=","; }
{
for(i=1;i<=NF;i++) x[i]=$i;
getline; $0=$0; gsub("[ \t]*0x","");
for(i=1;i<=NF;i++) $i=x[i] $i
print $0;
}

: Bearbeitet durch User
Autor: Matthias M. (matthiasm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft!! :)

Danke danke danke danke!!

Liam Z. schrieb:
> dachte du
> kennst dich etwas aus.

... das dachte ich auch ... fehlt wohl noch so einiges an Übung.

Autor: Liam Z. (liz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BEGIN { FS = ","; OFS=","; }
NF {
for(i=1;i<=NF;i++) x[i]=$i;
getline; $0=$0; gsub("[ \t]*0x","");
for(i=1;i<=NF;i++) $i=x[i] $i
print $0;
}

Autor: RS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man die Sache etwas systematischer angeht, stellt man fest, dass 
deine  Records aus 20 Feldern bestehen, die jeweils durch eine Leerzeile 
getrennt werden. Mit RS="" kannst du awk das entsprechend verklickern.

Der nächste Schritt wäre dann, die Werte in den Feldern 1 und 11 zu 
addieren, dann von Feld 2 und Feld 12, etc. Dabei ist zu beachten, dass 
die Feldern 1..10 quasi die Tausender- und Hunderterstelle

Autor: RS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, mein Browser hat rumgesponnen und den Beitrag vorzeitig 
abgeschickt... :-(

Wenn man die Sache etwas systematischer angeht, stellt man fest, dass
deine  Records aus 20 Feldern bestehen, die jeweils durch eine Leerzeile
getrennt werden. Mit RS="" kannst du awk das entsprechend verklickern.

Der nächste Schritt wäre dann, die Werte in den Feldern 1 und 11 zu
addieren, dann von Feld 2 und Feld 12, etc. Dabei ist zu beachten, dass
die Felder 1..10 quasi die Tausender- und Hunderterstelle des 
Ergebnisses enthalten und dementsprechend mit 0x100 multipliziert werden 
müssen.

Das passende awk-Programm würde dann also ungefähr so aussehen:
BEGIN { RS = "" }

{
  for (i = 1; i <= 10; ++i)
    printf("0x%04x, ", $i * "0x100" + $(i + 10))
}

Autor: ./. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieder nuex als Laien unterwegs.

Autor: RS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da darfst du dann natürlich nicht fehlen.

Autor: Ralf D. (doeblitz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RS schrieb:
[...]
> BEGIN { RS = "" }
> 
> {
>   for (i = 1; i <= 10; ++i)
>     printf("0x%04x, ", $i * "0x100" + $(i + 10))
> }

Dein awk liest Hexzahlen ein?

Ich würde da einfach bei nacktem Text bleiben:
BEGIN {
    RS = ""
    FS = ",[ \t\n\r]*"
}

{
    words = (NF-1)/2
    for (i = 1; i <= words; ++i)
        printf("%s%s, ", $i, substr($(i + words), 3, 2))
    print ""
}

Die Variable words erhält dynamisch die Zahl der auszugebenden 
16bit-Worte, die Korrektur "-1" ist erforderlich, da ein leeres Feld am 
Ende des Records erkannt wird (OK, an sich wird das durch implizites 
truncating schon erledigt, aber ich bevorzuge es, so etwas explizit zu 
coden, man will das ja auch in 20 Jahren noch leicht modifizieren 
können).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.