Выбрать через одно слово из строки

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Grih65kop
Сообщения: 145

Выбрать через одно слово из строки

Сообщение Grih65kop »

Есть список пользователей в таком виде:

"Ivan B","iv","Petr Os","Oms","Soa OS","sso"

Хочу выбрать их ники, а это: iv, Oms, sso, т.е. получается через одно слово в строке, с разделителем ","

Ранее с подобным не сталкивался, подскажите, пожалуйста, в какую сторону смотреть.
Спасибо сказали:
Аватара пользователя
Gineaser
Сообщения: 157
Статус: Evrashka
ОС: Arch Linux

Re: Выбрать через одно слово из строки

Сообщение Gineaser »

Я бы это на питоне сделал, а не на баше
Обезьянка видит - Обезьянка делает...
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: Выбрать через одно слово из строки

Сообщение Brainsburn »

Gineaser писал(а):
06.05.2012 02:03
Я бы это на питоне сделал, а не на баше

А я бы на Ямайку слетал...



Код: Выделить всё

cat file.txt | sed 's/,/\n/g' | awk 'NR%2 != 1'

т.е. сначала запятые заменяем на переносы строки, а потом авком показываем каждую вторую строку. Кавычки можно удалить отдельно: 's/\"//g'
Спасибо сказали:
Аватара пользователя
Gineaser
Сообщения: 157
Статус: Evrashka
ОС: Arch Linux

Re: Выбрать через одно слово из строки

Сообщение Gineaser »

Потом это надо слепить вкучу разделяя запятыми.
Не проще написать две строчки на питоне? Не понятен Ваш сарказм? Мой вопрос был на уточнение имеено на баше требуется решить задачу, ли нужен конечный результат.
Обезьянка видит - Обезьянка делает...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Выбрать через одно слово из строки

Сообщение sash-kan »

$ echo '"Ivan B","iv","Petr Os","Oms","Soa OS","sso"' | sed -r 's/"\w+ \w+"//g;s/,,/,/g;s/^,//;s/,$//'
"iv","Oms","sso"
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Выбрать через одно слово из строки

Сообщение SLEDopit »

sash-kan писал(а):
06.05.2012 04:56
$ echo '"Ivan B","iv","Petr Os","Oms","Soa OS","sso"' | sed -r 's/"\w+ \w+"//g;s/,,/,/g;s/^,//;s/,$//'
Во-первых, можно сделать гораздо короче и без всяких -r:

Код: Выделить всё

echo '"Ivan B","iv","Petr Os","Oms","Soa OS","sso"' | sed 's/"[^"]* [^"]*",//g'

А во-вторых, если имя будет без пробела или ник с пробелом, то не сработает.
Чтобы пофиксить эту досадную багу я бы сделал так:

Код: Выделить всё

echo '"Ivan B","iv","Petr Os","Oms","Soa OS","sso"' | sed  's/^/@/;:b;s/@[^,]*,\([^,]*,*\)/\1@/;tb;s/@$//'


Brainsburn писал(а):
06.05.2012 02:19
cat file.txt | sed 's/,/\n/g' | awk 'NR%2 != 1'
Можно и без седа, одним awk'ом обойтись:

Код: Выделить всё

echo '"Ivan B","iv","Petr Os","Oms","Soa OS","sso"' | awk -F, '{for(i=2;i<=NF;i+=2){print $i}}'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
FatZer
Сообщения: 33
ОС: Gentoo

Re: Выбрать через одно слово из строки

Сообщение FatZer »

с sed'ом чего-то намудрили... одним s'ом же можно обойтись:

Код: Выделить всё

echo '"IvanB","iv","Petr Os","Oms","Soa OS","sso"' | sed -r 's/[^,]*,([^,]*(,|$))/\1/g'
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Выбрать через одно слово из строки

Сообщение sash-kan »

SLEDopit
прошу прощения, я неправильно истолковал условия задачи·
и моё решение, и ваше (основанное на этой моей невнимательности), неверны·
верное решение привёл FatZer
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: