두 파일에서 값 빼기

두 파일에서 값 빼기

아래와 같이 두 개의 파일이 있고 두 파일에서 값을 빼고 싶다고 가정해 보겠습니다.

파일 1 -

emcas_bdl_migrate=2
emcas_biaas_dev=691
emcas_brs_ba=462
emcas_cc_analytics=1985
emcas_clm_reporting=0
emcas_collab_xsat=3659
emcas_cpsd_cee=10
emcas_cpsd_hcp=0
emcas_e2ep_ba=81
emcas_edservices_bi=643

그리고 파일 2 -

emcas_bdl_migrate=2
emcas_biaas_dev=63
emcas_brs_ba=430
emcas_cc_analytics=2148
emcas_clm_reporting=16
emcas_collab_xsat=4082
emcas_cpsd_cee=11
emcas_cpsd_hcp=0
emcas_cs_logistics=0
emcas_e2ep_ba=195
emcas_edservices_bi=1059

파일 2는 추가 값을 가질 수 있습니다(예: emcas_cs_logistics=0두 번째 파일 extra). 최종 출력 파일에 병합됩니다.

원하는 출력을 파일 3으로 원함 -

emcas_bdl_migrate=0
emcas_biaas_dev=-628
emcas_brs_ba=-32
emcas_cc_analytics=163
emcas_clm_reporting=16
emcas_collab_xsat=423
emcas_cpsd_cee=11
emcas_cpsd_hcp=0
emcas_cs_logistics=0
emcas_e2ep_ba=-114
emcas_edservices_bi=416

답변1

다음을 위해 사용할 수 있습니다 awk:

awk -F= 'NR==FNR{a[$1]=$2;next}{printf "%s=%s\n",$1,$2-a[$1]}' file1 file2

답변2

또한 시도

awk -F= -vOFS="=" 'NR==FNR {T[$1] = $2; next} {$2 -= T[$1]} 1' file[12]
emcas_bdl_migrate=0
emcas_biaas_dev=-628
emcas_brs_ba=-32
emcas_cc_analytics=163
emcas_clm_reporting=16
emcas_collab_xsat=423
emcas_cpsd_cee=1
emcas_cpsd_hcp=0
emcas_cs_logistics=0
emcas_e2ep_ba=114
emcas_edservices_bi=416

이는 $1의 태그로 인덱싱된 T 배열에 있는 file1의 $2 값을 수집합니다. 그런 다음 file2를 읽고 해당 T 요소(또는 존재하지 않는 경우 0)를 인쇄하기 전에 file2의 값에서 뺍니다. 결과가 예상 출력과 다른 경우 두 가지 방법이 있습니다. 오타가 있는지 다시 확인해 보세요.

답변3

한 가지 방법은 연관 배열을 사용하는 것입니다. 이:

#!/bin/bash

# Declare a to be an associative array
declare -A a

# Read in file2, populating the associative array
while read l; do
  k=${l%=*}
  v=${l#*=}
  a[${k}]=${v}
done <file2.txt

# Read in file1.  Subtract the value for a key in file1
# from what was populated into the array from file2.
while read l; do
  k=${l%=*}
  v=${l#*=}
  (( a[${k}] -= ${v} ))
done <file1.txt

# Print out the resulting associative array.
for k in ${!a[@]}; do
  echo "${k}: ${a[${k}]}"
done

exit 0

답변4

Python을 사용하여 이를 수행하는 방법은 다음과 같습니다. 이것은 고전적인 경우라는 점에 유의하십시오.카운터 수집

#!/usr/bin/env python3

import argparse
from collections import Counter

def read(f):
    """Reads the contents of param=value file and returns a dict"""
    d = {}

    with open(f,'r') as fin:
        for item in fin.readlines():
            s = item.split('=')
            d[s[0]] = int(s[1])

    return d

def write(f, d):
    """Writes dict d to param=value file 'f'"""

    with open(f, 'w') as fout:
        for k,v in sorted(d.items()):
            fout.write('{}={}\n'.format(k,v))

def subtract(d1, d2):
    """
    Subtracts values in d2 from d1 for all params and returns the result in result.
    If an item is present in one of the inputs and not the other, it is added to
    result.

    Note: order of arguments plays a role in the sign of the result.
    """
    c = Counter(d1.copy())
    c.subtract(d2)
    return c

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('file1', type=str, help='path to file 1')
    parser.add_argument('file2', type=str, help='path to file 2')
    parser.add_argument('outfile', type=str, help='path to output file')

    args = parser.parse_args()

    d1 = read(args.file1)
    d2 = read(args.file2)

    d3 = subtract(d1,d2)

    write(args.outfile, d3)

위의 코드를 라는 파일에 저장 subtract_params하고 실행 권한을 추가합니다. 그런 다음 다음과 같이 호출할 수 있습니다.

subtract_params file1.txt file2.txt result.txt 

관련 정보