Форум сайта python.su
Добрый день. Необходимо заменить в формализованном файле слово “00000” на соответствующее значение из другой строки. Файл представляет собой список, где формат записи повторяется каждые 3 строки:
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 00000 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 00000 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 00000 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
Необходимо заменить “00000” на первой позиции третьей строки (не считая “2”) на первые 5 цифр второй строки (не считая “1”).
Ниже пример что должно получится:
Исходный текст:
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
Результат:
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
Сложность в том, что в тексте есть еще стоки “00000” и их менять не нужно. Если я правильно думаю, то необходимо считать каждую третью строку и сделать в них замену, затем записать обратно на свои места?Либо поставить соответствие “00000” третьей строки и “45857” второй строки с указанием конкретной позиции в файле? Помогите необразованному)
Офлайн
Dmitriy_Zконечно если вам именно это нужно
считать каждую третью строку и сделать в них замену
Офлайн
marvellikя не знаю как это реализовать
Офлайн
На awk можно преобразовать
[guest@localhost rep]$ ls
file.txt rep.awk
[guest@localhost rep]$ cat rep.awk
BEGIN {
state = 1
}
state == 1 {
state = 2
next
}
state == 2 {
state = 3
number = $2
sub(/[0-9]{5}/, "&|", number)
sub(/\|.*$/, "", number)
next
}
state == 3 {
state = 1
$2 = number
next
}
[guest@localhost rep]$
[guest@localhost rep]$ cat file.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 00000 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 00000 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 00000 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 00000 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
[guest@localhost rep]$ awk -f rep.awk file.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 45727 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 45856 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 45753 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
[guest@localhost rep]$ awk -f rep.awk file.txt >out.txt
[guest@localhost rep]$
[guest@localhost rep]$ cat out.txt
M2 PATHFINDER
1 45727U 20037E 20188.86502194 +.00000000 +00000-0 00000-1 0 00000
2 45727 97.7019 8.5530 0011736 229.6833 130.3359 14.91194477 2752
GAOFEN DUOMO (GFDM)
1 45856U 20042A 20188.90426115 +.00000000 +00000-0 00000-1 0 00009
2 45856 98.0171 261.9010 0011999 250.8191 109.1719 14.76719764 552
BY70-2
1 45857U 20042B 20188.90566225 +.00000000 +00000-0 00000-1 0 00006
2 45857 98.0148 261.9000 0009995 238.0031 122.0206 14.76180781 465
STARLINK
1 45753U 20038Z 20188.58795034 +.00000000 +00000-0 00000-1 0 00007
2 45753 52.9969 182.6350 0002434 313.5831 46.4982 15.64270213 3179
[guest@localhost rep]$
Офлайн
py.user.nextИзучаю питон, с AWK не знаком.
На awk можно преобразовать
Офлайн
Dmitriy_ZНУжно считывать и вторую строку чтобы из нее взять значение для замены “00000” в третьей строке.
Офлайн
Dmitriy_ZНу, это классическая программа в компьютерном мире, как и Sed. То есть для трансляции вот таких текстовых данных лучше изучить эти программы, им больше сорока лет. И вообще надо перейти на Linux, там эти все программы есть изначально, ничего не надо искать и доустанавливать.
Изучаю питон, с AWK не знаком.
Отредактировано py.user.next (Фев. 3, 2021 22:38:05)
Офлайн
py.user.nextдавай лучше сразу результат. Если можно то с комментариями чтобы я мог сам разобраться.
Офлайн
Ну, новички пусть сначала попробуют свои силы.
Офлайн
def one(fd): file = open(fd, 'r') try: while file: str1 = file.readline() str2 = file.readline() str3 = file.readline() tmp = str3.split(" ") if tmp[1] == "0"*5: tmp[1] = str2.split(" ")[1][:5] str3 = " ".join(tmp) yield str1 yield str2 yield str3 except IndexError: print('Check up the entered data!!!') except Exception as err: print(err) file.close() print(*one('in.txt')) def two(seq, fd): file = open(fd, 'w') for i in seq: file.writelines(i) file.close() two(one('in.txt'), 'out.txt')
Отредактировано AD0DE412 (Фев. 4, 2021 12:11:12)
Офлайн