Какой самый компактный или эффективный способ сделать несколько замен в файле в bash - PullRequest
0 голосов
/ 25 февраля 2010

У меня есть файл data.base, который выглядит так:

1234 XXXX
4321 XXXX
9884 ZZZZ
5454 YYYY
4311 YYYY
9882 ZZZZ
9976 ZZZZ

(... случайные вхождения до 10000 строк)

Я хотел бы создать файл с именем data.case, который наследуется от data.base только с заменами XXXX, YYYY, ZZZZ на числа с плавающей точкой.

Интересно, какой самый компактный / эффективный / короткий способ сделать это на bash или в друзьях?

Что я обычно делаю, это что-то вроде:

sed -e "s/XXXX/1.34555/g" data.base > temp1
sed -e "s/YYYY/2.985/g" temp1 > temp2
sed -e "s/ZZZZ/-4.3435/g" temp2 > data.case
rm -fr temp1 temp2

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

Спасибо

Спасибо

Ответы [ 5 ]

4 голосов
/ 25 февраля 2010

Используйте опцию, чтобы вывести несколько команд в одном седе:

sed "s/XXXX/1.34555/g; s/YYYY/2.985/g"; s/ZZZZ/-4.3435/g" data.base > data.case
2 голосов
/ 26 февраля 2010
$ cat sedcommands
s/XXXX/1.34555/g
s/YYYY/2.985/g
s/ZZZZ/-4.3435/g
$ sed -f sedcommands data.base > data.case
1 голос
/ 26 февраля 2010

вы можете использовать ассоциативные массивы в awk

awk 'BEGIN{
 # add as needed
 s["XXXX"]=1.3455
 s["YYYY"]=2.985
 s["ZZZZ"]=-4.3435
}
($2 in s) {  print $1,s[$2] }' file

выход

$ ./shell.sh
1234 1.3455
4321 1.3455
9884 -4.3435
5454 2.985
4311 2.985
9882 -4.3435
9976 -4.3435
0 голосов
/ 25 февраля 2010

Хотя sed может выполнять несколько замен за один проход, общий подход UNIX , который более широко применим и может быть объединен с другими командами: использовать командный конвейер:

cat data.base | \
   sed -e "s/XXXX/1.34555/g" | \
   sed -e "s/YYYY/2.985/g" | \
   sed -e "s/ZZZZ/-4.3435/g" > data.base

Перенаправление в конце будет 'unlink' старой базой данных, которая используется в качестве ввода cat; однако вы все равно могли бы использовать временный файл, чтобы вы могли перехватывать условия ошибки и не потерять исходную базу данных в процессе.

(При использовании конвейера полезно ознакомиться с программой tee, которая сохраняет поток в файл при его передаче)

0 голосов
/ 25 февраля 2010

сед-е "с / XXXX / 1,34555 / г; с / ГГГГ / 2,985 / г; с / ZZZZ / -4,3435 / г"

или поместите их в файл cmd и перечислить их.

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