subtrair uma linha de um arquivo por todas as linhas de outro arquivo

subtrair uma linha de um arquivo por todas as linhas de outro arquivo

Gostaria de subtrair coluna por coluna, uma linha de um arquivo, para todas as linhas de outro.

Entrada:file1

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

Entrada:file2

1 1 1 1

Saída desejada:file3

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

ah, sed?

Responder1

Com 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

Isso pressupõe que:

  1. a linha relevante file2é sempre a primeira
  2. a primeira linha file2e todas as linhas file1têm o mesmo número de colunas
  3. se houver vários espaços entre as colunas, file1você não se importa em preservá-los.

Responder2

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

Resultados

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

Premissas

  1. GNU dc
  2. Tantas colunas em arquivo1 e arquivo2, mas devem ser iguais.

Responder3

Solução bash pura.

Uso: ./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"

informação relacionada