AWK Spalten anfügen

F

Falcon83

Grünschnabel
Hallo,

ich suche eine Möglichkeit mit awk zwei Spalten aus aus zwei Dateien zu subtrahieren.
Spaltenorientierte Ausgabe ist mit awk kein Problem. Allerdings habe ich noch keinen Syntax gefunden, um aus zwei Dateien jeweils eine Spalte herauszufiltern und nebeneinander darzustellen bzw. voneinander zu subtrahieren.

Gruß,
Falcon83
 
Hallo

Dazu hast du mehrere Möglichkeiten.
Entweder zu liest die erste Datei komplett in ein Array ein (prüfen solange ARGIND == 1 ist ) und wenn du bei der zweiten Datei (ARGIND==2) bist, berechnest du die Werte und gibst sie aus.
Das ist bei sehr großen Dateien aber unpraktisch.
Oder du verwendest getline.
Oder du Mixt die Eingabe vorher Zeilenweise und übergibst beide Strings an awk, dann kannst du damit direkt arbeiten (Zeilenweise)

Letzeres als Beispiel:
Code:
# Nutze Redirect mit exec für jede Datei 
 exec 3<file1.txt ; #File1 kommt aus 3
 exec 4<file2.txt ; #File2 kommt aus 4
while read line1 <&3 && read line2 <&4;
do 
echo "$line1 $line2";
done

Das gibt dir aus beiden Dateien die Zeilen nebeneinander aus, so dass du entweder gleich selber rechnen kannst (nur mit integer statt echo ),oder an awk verfüttern.

Gruß Wolfgang
 
Zuletzt bearbeitet:
Wolfgang, er meint AWK.

In etwa folgendes AWK Skript (konnte es leider nicht testen!)

Code:
BEGIN {
  FSA=";";
  FSB=";";
  DateiA="a.txt";
  DateiB="b.txt";  
  Ausgabe="ausgabe.txt";
  OK=TRUE;
  do {
    if (getline<DateiA) { AnzahlA=Split($0,FeldA,FSA); } else OK=FALSE;
    if (getline<DateiB) { AnzahlB=Split($0,FeldB,FSB); } else OK=FALSE;
    if (OK) printf("%s;%s\n",FeldA[1],FeldB[1]) > Ausgabe;
  } while (OK);
  close DateiA;
  close DateiB;
  close Ausgabe;
}
 
Zuletzt bearbeitet:
Ich weiß, dass er awk meint. Auf getline hatte ich ja schon verwiesen.
Meine Methode war als eine Alternative gedacht, beide Zeilen nebeneinander auszugeben, welche ja dann leicht via Pipe an awk verfüttert werden kann.
Das ist IMHO atomarer und du kannst direkt auf die felder mit $x zugreifen.
Code:
mein code...done |awk '{ERG=$1 -$5;print ....}'
 
Hallo,

vielen Dank für Eure Antworten. Hatte inzwischen selbst eine Lösung gefunden, die zwar nicht sehr elegant ist, aber ihren Zweck erfüllt.

1. Skript

Code:
#/bin/bash
cp zusammenfuehren2Dateien.sh zusammenfuehren2Dateien.sh.tmp
while [ $i -le $3 ]
do
 
       # platzhalter in steuerdatei ersetzen
       sed -i "s/%ANZAHL/$i/g"  "zusammenfuehren2Dateien.sh"
       sed -i "s/%DATEI1/$1/g"  "zusammenfuehren2Dateien.sh"
       sed -i "s/%DATEI2/$2/g"  "zusammenfuehren2Dateien.sh"
       zusammenfuehren2Dateien.sh
       cp  zusammenfuehren2Dateien.sh.tmp zusammenfuehren2Dateien.sh
       i=`expr $i + 1`

done

 awk '{print $1 " " $4 - $2}' Zusammenfuehren_$2-$1.dat > Subtrahiert_$2-$1.dat
 rm Zusammenfuehren_$2-$1.dat

2. Skript zusammenfuehren2Dateien.sh:
Code:
#/bin/bash
(awk 'FNR == %ANZAHL {printf  $1 " " $2 " "}' %DATEI1.dat %DATEI2.dat && echo " ") >> Zusammenfuehren_%DATEI2-%DATEI1.dat

Falcon83
 

Ähnliche Themen

sed in awk

Komplette Spalten aus Datei löschen.

sed - Bitte um Unterstützung

Spalten einer Datei in neue Datei integrieren.

mehrsprachiges Shellscript - wie umsetzen?

Zurück
Oben