Как я могу вычесть группы из двух на две строки файла на Python? - PullRequest
1 голос
/ 24 марта 2019

Я хотел бы вычесть две последовательные строки файла. Например:

У меня есть файл с 4 000 000 строк, с такими данными:

    2345  345.67
    2344  245.34
    45678  331.45
    45679  339.32
    7654   109.42
    7655   250.78

Итак, я хотел бы вычесть две последовательные строки (столбец 2) и вывести абсолютный результат, только если результат больше или равен 60. Субстрат будет состоять из двух строк по две строки, и вывести его до первого значения столбца 1 Я имею в виду, я хотел бы получить такой результат:

    2345   100.13
    7654   141.36

Я пытался сделать это в bash, но это очень медленно, и я хотел бы сделать это на python, но я понятия не имею, как это сделать, я новичок в python. Как я могу прочитать мой файл прямым способом и как я могу использовать модули Python? Я прочитал, что датафрейм и пресс могут мне помочь, но как? Можете ли вы вести меня, пожалуйста?

Большое спасибо.

х = 1

while [$ x -ge 2]

сделать

а = sed -n '1,2p' file.dat| awk 'NR>1{print $1-p} {p=$1}'

echo $ a >> results.dat

grep -v "$ a" file.dat> file.o

mv file.o file.dat

сделано

~
~

1 Ответ

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

Вы можете записать результат непосредственно в файл из Python. Например, как это:

# import regular expression module of python
import re
# open file (replace data.txt with input file name and out.txt with the output file name)
with open('data.txt', 'r') as f, open('out.txt', 'w') as o:
    # read the first line (i=0) manually
    currentLine = re.findall('\d+\.?\d*', f.readline())
    # index i starts with 0 and refers to the currentLine, s.t.
    # prevLine
    # currentLine [i=0]
    # prevLine [i=0]
    # currentLine [i=1]
    # therefore we only look at every second iteration
    for i,line in enumerate(f.readlines()):
        # set the previous line to the current line
        prevLine = currentLine
        # extract numbers
        currentLine = re.findall('\d+\.?\d*', line)
        if i%2==0: # look only at every second iteration (row 1 - row 2; row 3 - row 4; etc.)
            # calculate the absolute difference between rows i and i+1, i.e. abs((i,0)-(i+1,1))
            sub = abs(float(prevLine[1])-float(currentLine[1]))
            # if this absolute difference is >= 60, print the result
            if sub>=60:
                outputLine = "%s %s"%(str(prevLine[0]), str(sub))
                print(outputLine)
                o.write(outputLine+"\n") # write the line to the file 'out.txt'

Вывод ваших данных будет таким:

2345 100.33000000000001
7654 141.36
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...