Изменение последней строки во многих файлах в sed - sed только изменение в первом - PullRequest
1 голос
/ 24 марта 2020

Это мой сценарий

#!/bin/bash
for num in {1..100}; 
do 
    sed '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' eq8_$num.gro | tee eq9_$num.gro
done

Я хочу заменить «6.36535 23.3762512.09434» на «6.76889 21.76071 12.19032» (в этом случае важны пробелы, файлы имеют разное количество строк, и это последняя строка каждого файла).

Sed работает только с первым файлом. Пример ввода

eq8_1.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
  227BGL     C529155   4.134  15.788   5.556
  227BGL     H529156   4.186  15.879   5.529
19144SOL     OW73518   0.911  13.325   6.427
19144SOL    HW173519   0.879  13.256   6.485
20389SOL     OW77253   0.644  14.144   5.376
20389SOL    HW177254   0.712  14.203   5.344
 6.36535    23.3762512.09434

eq8_2.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL    HW175853   4.186  14.169   5.941
19922SOL    HW275854   4.071  14.076   5.973
19924SOL     OW75858   1.466  20.721   5.803
19924SOL    HW175859   1.489  20.642   5.852
 6.36535    23.3762512.09434

Примеры вывода

eq9_1.gro

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
  227BGL     C529155   4.134  15.788   5.556
  227BGL     H529156   4.186  15.879   5.529
19144SOL    HW173519   0.879  13.256   6.485
19144SOL    HW273520   1.007  13.318   6.431
20389SOL    HW177254   0.712  14.203   5.344
20389SOL    HW277255   0.577  14.201   5.413
   6.76889  21.76071  12.19032

eq9_2.gro (последняя строка не меняется, почему?)

900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
19922SOL     OW75852   4.097  14.168   5.977
19922SOL    HW175853   4.186  14.169   5.941
19924SOL     OW75858   1.466  20.721   5.803
19924SOL    HW175859   1.489  20.642   5.852
 6.36535    23.3762512.09434

Я также пробую другой метод

#!/bin/bash
for num in {1..100}; 
do 
    sed -i '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' eq8_$num.gro
done

Он тоже не работает.

Если вы не знаете, как это сделать в sed, может быть, вы знаете, как это сделать в awk?

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Возможно, вам нужно убедиться, что в конце файла есть символ новой строки. Реализации sed обычно требовательны к значению $. Например,

sed -i.bak -e '$a\' file

или даже лучше, если ваша оболочка это позволяет:

[ -n "$(tail -c1 file)" ] && printf '\n' >>file 
1 голос
/ 24 марта 2020

Это может сработать для вас (GNU sed и параллельно):

parallel -q sed -s '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' ::: eq8_{1..100}.gro

Это будет применять вышеупомянутую команду sed substitution к последней строке файла 100 от eq8_1.gro до eq8_100.gro.

Вывод получится в стандартный вывод и может быть захвачен > outFile.

NB. Исходные файлы не будут изменены.

Если исходные файлы необходимо изменить на месте, используйте:

parallel -q sed -i.backup '$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/' ::: eq8_{1..100}.gro

Чтобы оставить исходные файлы на месте и создать новые файлы с изменениями, используйте:

parallel sed -s \''$s/ 6.36535    23.3762512.09434/   6.76889  21.76071  12.19032/'\' \> {.}.new.txt ::: eq8_{1..100}.gro
1 голос
/ 24 марта 2020

Вы пытались использовать sed -i 's / Pattern1 / Pattern2 / g', g в конце выполняет глобальную замену для всех сопоставленных шаблонов в файле.

...