Математическое вычитание значений в одном файле из другого файла - PullRequest
0 голосов
/ 04 марта 2019

У меня есть два файла, каждый одинакового размера (100x12), содержащий числовые значения, положительные и отрицательные, разделенные запятыми.

Пример вывода файла 1:

-14.99,-15.6,8.0 ->
-9.0,34.87,98.98 ->
(and so on)

ПримерВывод файла 2:

-15.99,-18.6,8.00 ->
-3.0,34.34,-98.88 ->
(and so on)

Я пытался:

awk '{getline t<"file1"; print $0-t}' file2

Однако это только вычитает первый столбец.Как я могу расширить это, чтобы численно вычесть file1 / column1 из file2 / column2?

Я был бы открыт для использования панд для выполнения этой операции.Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 05 марта 2019

Сначала данные

file1 = """
-14.99,-15.6,8.0 ->
-9.0,34.87,98.98 ->
"""
file2 = """
-15.99,-18.6,8.00 ->
-3.0,34.34,-98.88 ->
"""

from io import StringIO # faking file on disk

Ответ панд.

import pandas as pd
converter = {2: lambda s: float(s.split(' ')[0])}
df1 = pd.read_csv(StringIO(file1), header=None, converters=converter)
df2 = pd.read_csv(StringIO(file2), header=None, converters=converter)
(df1-df2).to_csv('pddiff12.csv', header=False, index=False)    

Или сверните его чистым питоном.

# cmt 1 -> indent under with-statement

def read_csv(file_name):
    #with open('file_name', 'rt') as f1: # uncomment when reading from disk
    f1 = StringIO(file_name) # comment out when reading from disk
    rows = [r for r in f1.readlines() if r.strip()] # cmt 1
    crunch = lambda row: [float(r) for r in row.split(',')]
    rows = [crunch(r.split(' ')[0]) for r in rows]
    return rows

data1 = read_csv(file1)
data2 = read_csv(file2)

diff = []
for row1, row2 in zip(data1, data2):
    diff.append([i-j for i, j in zip(row1, row2)])

with open('diff12.csv', 'wt') as d12:
    for row in diff:
        d12.write(', '.join((str(v) for v in row)) + '\n')

Панды наверняка легче читатьи начать работать, хотя это заметная зависимость, если кто-то стремится этого избежать.В этом случае я думаю, что я бы не стал.

0 голосов
/ 04 марта 2019

В awk:

$ awk '
NR==FNR {                # hash file1 values to a
    for(i=1;i<=NF;i++)
        a[FNR][i]=$i
    next
}{                       # process file2, subtract values from file1 respectives
    for(i=1;i<=NF;i++)
        $i=$i-a[FNR][i]
}1' file1 file1

Выход:

-1,-3,8.00 ->
6,-0.53,-98.88 ->
0 голосов
/ 04 марта 2019

Вы можете попробовать с утилитами Unix .. вставить с awk

paste file1.txt file2.txt | 
     awk -F"[,\t]"  -v OFS="," ' { for(i=1;i<4;i++) { $i=$(i+3)-$i } print $1,$2,$3 } '

с заданными входами

$ cat halletwx1.txt
-14.99,-15.6,8.0
-9.0,34.87,98.98

$ cat halletwx2.txt
-15.99,-18.6,8.00
-3.0,34.34,-98.88

$ paste halletwx1.txt halletwx2.txt | awk -F"[,\t]"  -v OFS="," ' { for(i=1;i<4;i++) { $i=$(i+3)-$i } print $1,$2,$3 } '
-1,-3,0
6,-0.53,-197.86

$
0 голосов
/ 04 марта 2019

С макушки головы - проверь синтаксис!

import numpy as np

with open("file1.txt, "r") as f1:
    with open("file2.txt, "r") as f2:
       array1 = np.asarray(f1.read().split(','))
       array2 = np.asarray(f2.read().split(','))
       result = array1 - array2
       print([x for x in result])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...