Заменить конкретную строку (в фиксированной позиции) в текстовом файле на номер строки - PullRequest
0 голосов
/ 08 июля 2019

Я создал скрипт (bash) для замены фигуры в определенной позиции в текстовом файле.

Это файл data.txt:

Date; Buy; Sell; Coupon; Fee
21/6/2019;0.0000000000;0.0000000000;0.0000000000

Я хочу заменить 12-й символ.

Найдите ниже часть кода, которая меняет позицию, если 12-я позиция равна "0", измените цифру на "59"

sed 's/^\(.\{11\}\)0/\159/' data.txt

Пока все хорошо, проблема в том, что я хочу сделать изменения только в последнем (# 34) изображении файла (data.txt) как:

Date; Buy; Sell; Coupon; Fee
26/4/2006;0.0000000000;-200000000.0;0.0000000000
4/5/2006;0.0000000000;-100000000.0;0.0000000000
4/5/2006;0.0000000000;-300000000.0;0.0000000000
1/12/2006;0.0000000000;0.0000000000;-30000000.00
5/12/2006;0.0000000000;-250000000.0;0.0000000000
8/12/2006;0.0000000000;-250000000.0;0.0000000000
19/12/2006;0.0000000000;-650000000.0;0.000000000
18/1/2007;0.0000000000;-250000000.0;0.0000000000
1/2/2007;0.0000000000;-250000000.0;0.0000000000
2/2/2007;0.0000000000;-720000000.0;0.0000000000
28/3/2007;0.0000000000;-200000000.0;0.0000000000
28/3/2007;0.0000000000;-400000000.0;0.0000000000
3/5/2007;0.0000000000;-250000000.0;0.0000000000
3/5/2007;0.0000000000;-750000000.0;0.0000000000
3/5/2007;0.0000000000;-250000000.0;0.0000000000
5/6/2007;0.0000000000;-500000000.0;0.0000000000
3/7/2007;0.0000000000;-300000000.0;0.0000000000
3/12/2007;0.0000000000;0.0000000000;-281000000.0
1/12/2008;0.0000000000;0.0000000000;-281000000.0
1/12/2009;0.0000000000;0.0000000000;-281000000.0
1/12/2010;0.0000000000;0.0000000000;-281000000.0
5/4/2011;525000000.00;0.0000000000;0.0000000000
1/12/2011;0.0000000000;0.0000000000;-254750000.0
2/11/2012;1348000000.0;0.0000000000;0.0000000000
2/11/2012;840000000.00;0.0000000000;0.0000000000
3/12/2012;0.0000000000;0.0000000000;-145350000.0
2/12/2013;0.0000000000;0.0000000000;-145350000.0
1/12/2014;0.0000000000;0.0000000000;-145350000.0
1/12/2015;0.0000000000;0.0000000000;-145350000.0
1/12/2016;0.0000000000;0.0000000000;-145350000.0
1/12/2017;0.0000000000;0.0000000000;-145350000.0
3/12/2018;0.0000000000;0.0000000000;-145350000.0
21/6/2019;0.0000000000;0.0000000000;0.0000000000

Я использовал следующее:

#!/bin/bash

i=1
while read line;do
if((i==34));then
sed 's/^\(.\{11\}\)0/\159/' data.txt
fi
((i++))

Кажется, что есть проблема с условием, скрипт запускает никогда не останавливаться, никакой вывод не похож на цикл без конца.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Попробуйте это:

sed '$s/^\([^;]\+;\)0\(.*\)/\159\2/' input

Адрес $ указывает sed работать только на последней строке в файле. Вместо замены 12-го символа, вероятно, целесообразно заменить символ после первого ;.

Нет абсолютно никакого смысла разбивать строки для sed на bash. Это одна из основных функций sed для циклического перебора линий.

0 голосов
/ 08 июля 2019

Следующие операции работают с gawk, mawk, original-awk и busybox:

awk 'END {if(int($2)==0) $2=59; print}' {O,}FS=\; data.txt

Выходы:

21/6/2019;59;0.0000000000;0.0000000000

В последней записи (строке) awk проверяет целочисленное значение второй точки с запятой ; с разделителями, изменяя его на 59, если оно равно нулю.

...