BrotmitMayo schrieb:
Ich glaube habe es hinbekommen ☺ Ich weis nicht ob es wirklich sauber ist....
Du könntest es ja einfach mal ausführen - meine Bash akzeptiert das so nicht...
| $ for a in $(txt2.txt ); do grep $a txt1.txt >/dev/null; rc=$?; if [ $rc -eq 1 ]; then echo "$a $rc"; fi; done
-bash: txt2.txt: Kommando nicht gefunden.
|
BrotmitMayo schrieb:
Ich habe zwei Textdateien txt1 und txt2(siehe unten), ich möchte beide mit einer for Schleife vergleichen und nur die Differenz ausgeben.
BrotmitMayo schrieb:
Ziemlich umständlich 🤣 diff ist wohl die bessere Lösung ☺
Wenn die Vorgaben so locker sind, dass nicht gefordert wird, dass man selbst in der for-Schleife über die Zeilen den Dateien iteriert, kann man das natürlich auch so auslegen 😈 :
| files=(txt1 txt2)
for ((i=0; i < $(( ${#files[@]} / ${#files[@]} )); i++)); do
diff "${files[$i]}" "${files[$(($i + 1))]}"
done
|
Sonst kann man deinen Ansatz noch etwas vereinfachen:
| IFS=$'\n'
for a in $(cat txt2.txt); do
grep -q "$a" txt1.txt || echo "$a not in txt1.txt but in txt2.txt"
done
|
Oder mit einer zweiten for-Schleife verkomplizieren, wenn man grep loswerden möchte:
| IFS=$'\n'
for a in $(cat txt2.txt); do
match=0
for b in $(cat txt1.txt); do
[ "$a" = "$b" ] && match=1 && break
done
[ $match -eq 0 ] && echo "$a not in txt1.txt but in txt2.txt"
done
|
Wobei eine while- statt einer for-Schleife eigentlich schöner wäre - was ist denn jetzt genau das Vergleichskriterium? Wird zeilenweise verglichen oder geht es darum, dass eine Zeile aus txt2.txt nicht in txt1.txt vorkommt, egal an welche Position sie steht?
Ein zeilenweiser Vergleich ginge da z.B. so (wie in den Links von frostschutz angedeutet) - ist eine Datei länger, muss sie von zweiten read ausgelesen werden, damit das klappt:
| counter=1
while read -r a; read -r b <&3; do
[ "$a" != "$b" ] && printf "difference in line %03d:\t'%s' != '%s'\n" $counter "$a" "$b"
(( counter++ ))
done <txt1.txt 3<txt2.txt
|
Nicht in beiden Dateien vorkommende Zeilen kann man sich z.B. auch einfach mit comm holen, wenn beide Dateien schon sortiert sind:
| comm -3 txt1.txt txt2.txt
|