한 파일의 한 줄을 다른 파일의 모든 줄에서 뺍니다.

한 파일의 한 줄을 다른 파일의 모든 줄에서 뺍니다.

한 파일의 행을 가져와 다른 파일의 모든 행을 열별로 빼고 싶습니다.

입력하다:file1

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

입력하다:file2

1 1 1 1

원하는 출력:file3

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

어, sed?

답변1

그리고 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

이는 다음을 가정합니다.

  1. 관련 줄은 file2항상 첫 번째 줄입니다.
  2. 첫 번째 행 file2과 모든 행 file1의 열 수가 동일합니다.
  3. 열 사이에 공백이 여러 개 있으면 file1공백을 유지하지 않아도 됩니다.

답변2

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

결과

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

가설

  1. GNU DC
  2. file1과 file2의 열 개수는 동일하지만 동일해야 합니다.

답변3

순수한 bash 솔루션.

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

관련 정보