AWK / SED.Как убрать скобки в простом текстовом файле - PullRequest
11 голосов
/ 18 января 2012

У меня есть текстовый файл, который выглядит следующим образом:

(-9.1744438E-02,7.6282293E-02) (-9.1744438E-02,7.6282293E-02)  ... and so on.

Я хотел бы изменить файл, удалив все скобки и новую строку для каждой пары, чтобы он выглядел так:

-9.1744438E-02,7.6282293E-02
-9.1744438E-02,7.6282293E-02
...

Простой способ сделать это?

Любая помощь приветствуется,

Фред

Ответы [ 6 ]

31 голосов
/ 18 января 2012

Я бы использовал tr для этой работы:

cat in_file | tr -d '()' > out_file

С помощью переключателя -d он просто удаляет любые символы из данного набора.

Чтобы добавить новые строки, вы можетепротяните через два tr s:

cat in_file | tr -d '(' | tr ')' '\n' > out_file
3 голосов
/ 18 января 2012

Как было сказано, почти:

sed 's/[()]//g' inputfile > outputfile

или в awk:

awk '{gsub(/[()]/,""); print;}' inputfile > outputfile
2 голосов
/ 18 января 2012

Это будет работать -

awk -v FS="[()]" '{for (i=2;i<=NF;i+=2) print $i }' inputfile > outputfile

Тест:

[jaypal:~/Temp] cat file
(-9.1744438E-02,7.6282293E-02) (-9.1744438E-02,7.6282293E-02)

[jaypal:~/Temp] awk -v FS="[()]" '{for (i=2;i<=NF;i+=2) print $i }' file
-9.1744438E-02,7.6282293E-02
-9.1744438E-02,7.6282293E-02
1 голос
/ 10 июня 2013

Думаю, мы все это знаем, но только для того, чтобы подчеркнуть:

Использование команд bash лучше с точки зрения времени, затрачиваемого на выполнение, чем использование awk или sed для выполнения той же работы.Например, старайтесь не использовать sed / awk, где может хватить grep.

В этом конкретном случае я создал файл длиной 100000 строк, каждый из которых содержит символы "(" а также ")".Затем набрал

$  /usr/bin/time -f%E -o log cat file | tr -d "()"

и снова

$  /usr/bin/time -f%E -ao log sed 's/[()]//g' file

И результаты были:

05,44 сек: использование tr

05,57 сек: использование sed

1 голос
/ 18 января 2012

Это может работать для вас:

echo "(-9.1744438E-02,7.6282293E-02) (-9.1744438E-02,7.6282293E-02)" |
sed 's/) (/\n/;s/[()]//g'
-9.1744438E-02,7.6282293E-02
-9.1744438E-02,7.6282293E-02
0 голосов
/ 18 января 2012
cat in_file | sed 's/[()]//g' > out_file

Из-за проблем с форматированием из вашего вопроса не совсем понятно, нужно ли вам также вставлять новые строки.

...