Subtrahieren Sie eine Zeile aus einer Datei von allen Zeilen aus einer anderen Datei

Subtrahieren Sie eine Zeile aus einer Datei von allen Zeilen aus einer anderen Datei

Ich möchte spaltenweise eine Zeile aus einer Datei von allen Zeilen einer anderen Datei subtrahieren.

Eingang:file1

1 1 1 1
3 1 5 1
1 5 8 2

Eingang:file2

1 1 1 1

Gewünschte Ausgabe:file3

0 0 0 0
2 0 4 0
0 4 7 1

Ohh, Sed?

Antwort1

Mit awk:

awk 'NR==1   { for(i=1; i<=NF; i++) a[i] = $i }
     FNR!=NR { for(i=1; i <NF; i++) $i -= a[i]; print }' file2 file1

Dies setzt Folgendes voraus:

  1. die relevante Zeile file2ist immer die erste
  2. die erste Zeile in file2und alle Zeilen in file1haben die gleiche Anzahl Spalten
  3. Wenn zwischen den Spalten mehrere Leerzeichen vorhanden sind, file1möchten Sie diese nicht beibehalten.

Antwort2

tr ' -' ' _' < file1 |          # dashes -> underscores per dc requirements
dc -e "
[q]sq                           # macro for quitting
[z :x     z0<a]sa               # macro for main stack -> array x[]
[z ;x -SM z0<b]sb               # macro for doing: stack M = stack[i]-x[i]
[LMdn32an zlk>c]sc              # macro for printing stack M elements
[?z0=q lbx lcx 10Pc z0=?]s?     # do-while loop to read in file1 per line and run the macros "b" then "c"
$(< file2 tr ' -' ' _')         # load up the main stack with file2
zsk lax l?x                     # store cols in reg. k, call macro "a" and
" > file3

Ergebnisse

0 0 0 0
2 0 4 0
0 4 7 1

Annahmen

  1. GNU DC
  2. So viele Spalten in Datei1 und Datei2, aber sie sollten gleich sein.

Antwort3

Reine Bash-Lösung.

Verwendung: ./subtracting.sh file1 file2

#!/bin/bash

read -ra subtrahend < "$2"

while read -ra minuend; do
    for i in "${!minuend[@]}"; do
        echo -n $((minuend[$i] - subtrahend[$i]))
    done
    echo
done < "$1"

verwandte Informationen