
Ich habe zwei Dateien, die aus Zahlen bestehen. Nun möchte ich die Zeile der ersten Datei mit allen Zeilen der zweiten Datei abgleichen und den Zähler erhöhen, wenn eine Übereinstimmung gefunden wird. Wie schreibe ich das Bash-Skript dafür?
file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3
Antwort1
Angenommen file1.txt
, wir file2.txt
haben Zahlensätze wie diese:
file1.txt
:
1
2
4
6
7
file2.txt
:
2
6
7
8
9
Sie können mehrere Ansätze ausprobieren, je nachdem, was Sie mit den Daten machen möchten oder was Sie sonst noch dabei erfassen möchten.
Grep kann eine Datei nach einer Musterzeichenfolge durchsuchen. Die Muster können mithilfe einer anderen Datei mithilfe des
-f
Flags bereitgestellt werden. Das-x
Flag stellt außerdem sicher, dass Sie nur Übereinstimmungen in ganzen Zeilen finden, sodass ein Muster von „2“ nicht mit „24“ übereinstimmt. Schließlich zählt das-c
Flag die Anzahl der Übereinstimmungen. Wenn Sie alles zusammenfügen, erhalten Sie:grep -x -c -f file1.txt file2.txt
Wenn Sie mit den Zahlen neben der Ermittlung der Gesamtanzahl auch andere Dinge tun möchten, können Sie einen eher manuellen Ansatz wählen:
counter=0 while read number; do grep -q -x "$number" file2.txt && let counter=$counter+1 done < file1.txt echo $counter
Dies ist viel weniger effizient, da Sie file2.txt für jede Zeile in file1.txt erneut lesen, aber wenn Sie auch andere Dinge mit der Nummer machen oder die Datei nebenbei bearbeiten möchten, wäre es einfacher, eine Schleife wie diese einzufügen. Nicht die Verwendung des
-q
Flags, sodass grep stumm ist und nur einen Exit-Code zurückgibt. Mit diesem Code können wir feststellen, ob eine Übereinstimmung gefunden wurde oder nicht, und den Zähler nur erhöhen, wenn dies der Fall ist.
Wie auch immer Sie vorgehen, berücksichtigen Sie die Möglichkeit, dass einige Zeilen teilweise Übereinstimmungen mit Zahlen enthalten, die Teilzeichenfolgen anderer Zahlen sind. Außerdem müssen Sie darüber nachdenken, was passieren soll, wenn es mehr als eine Übereinstimmung pro Zeile gibt. Erhöht jeder Duplikat den Zähler oder geschieht das nur einmal? Beachten Sie, dass die beiden oben genannten Optionen dies unterschiedlich handhaben! Für einige Datensätze liefern sie unterschiedliche Ergebnisse. Wenn Sie möchten, dass sie dieselben Ergebnisse liefern, können beide Techniken angepasst werden. Beispielsweise könnte die erste eine Version der Datei prüfen, aus der alle Duplikate entfernt wurden, sodass nichts mehr als einmal übereinstimmt:
grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)