Re: Обработать .csv из командной строки

2010-08-11 Нитка Andrew Bondarenko
On 08/10/2010 09:00 PM, Людмила Бандурина wrote:
>
> Огромное спасибо, понятно, получилось!!!
> А где можно почитать доступно про awk, желательно по-русски?
Ну, ИМХО, лучше man awk не найти, хоть и не на русском.

> А можно с его помощью эти самые name отсортировать по алфавиту?
Нет ничего невозможного! =)
Только для этого надо завести именованый массив, вместо print заполнять 
его, а потом в секции финализации его распечатать, при этом деля по 8 
штук в строку. Не думайте, что я это предлагал ;)

В вашем случае, кажется, лучшим решением будет такое:

cat ВХОДНОЙ_ФАЙЛ | sort | awk -F',' ' BEGIN { current=1 } { if 
(current<8) { printf $1", " ; current++ ; } else { print $1", " ; 
current=1 ; } } ' > ВЫХОДНОЙ_ФАЙЛ

То есть, файл будет отсортирован до того, как будет отдан awk.


-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-11 Нитка Andrew Bondarenko
On 08/10/2010 09:00 PM, Людмила Бандуринаwrote:
>
> Огромное спасибо, понятно, получилось!!!
> А где можно почитать доступно про awk, желательно по-русски?
Ну, ИМХО, лучше man awk не найти, хоть и не на русском.

> А можно с его помощью эти самые name отсортировать по алфавиту?
Нет ничего невозможного! =)
Только для этого надо завести именованый массив, вместо print заполнять 
его, а потом в секции финализации его распечатать, при этом деля по 8 
штук в строку. Не думайте, что я это предлагал ;)

В вашем случае, кажется, лучшим решением будет такое:

cat ВХОДНОЙ_ФАЙЛ | sort | awk -F',' ' BEGIN { current=1 } { if 
(current<8) { printf $1", " ; current++ ; } else { print $1", " ; 
current=1 ; } } ' > ВЫХОДНОЙ_ФАЙЛ

То есть, файл будет отсортирован до того, как будет отданawk.

P.S. Что-то от меня письма, похоже, не доходят =(


-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Alex Emergy
for i in `awk -F, '{print $1}' infile|sort`;do echo -n "$i, ";done

11.08.2010 08:44, Катраев Виталий пишет:
> 11 августа 2010 г. 8:23 пользователь Сергей Блохин  
> написал:
>> Так sort сортирует строки, а у Людмилы идёт одна строка через запятую.
>
> Каюсь. Невнимателен.
>
>

-- 
С уважением,
Alex Emergy

-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Сергей Блохин
Так sort сортирует строки, а у Людмилы идёт одна строка через запятую.

11.08.2010, 07:44, "Катраев Виталий" :
> 11 августа 2010 г. 1:23 пользователь Людмила Бандурина
>  написал:
>
>>  Что-то я никак не въеду, как мне добавить к работающей функции,
>>  предложенной Andrew Bondarenko,  это самое sort?
>
> Так пайпом же
> команда | sort > имя_файла
>
> --
> Adios, HaND:)
> br, Zawullon.
>
> E-Mail/Jabber: zawul...@gmail.com
> http://zawullon.spb.ru/
>
> I use:
> Ubuntu 10.10 and Gentoo on HP Pavilion tx2640er
> Ubuntu 10.04 on Apple iMac 20' mid 2007
> --
> ubuntu-ru mailing list
> ubuntu-ru@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru

-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка alkosasha
Приветствую,

Как вариант:

   cut -d, -f1 file_name  | tr '\n' ','

Если нужно избавиться от последнего разделителя:

   cut -d, -f1 file_name  | sed 'N;s/\n/,/g'

С.

Людмила Бандурина wrote:
> Здравствуйте,
> 
> Посоветуйте, пожалуйста, способ обработать .csv
> 
> Имеется:
> 
> "name1","name_eng1","code1","shortCode1"
> "name2","name_eng2","code2","shortCode2"
> 
> И так далее, таких строк очень много
> 
> Нужно получить:
> 
> "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8",
> "name9", "name10", "name11", "name12", "name13", "name14", "name15", 
> "name16",
> 
> И так далее - по 8 в строке, только первое поле из имеющихся в .csv
> Или хотя бы в одну строку - но только первое поле.
> Кавчки есть во входном файле, они должны быть и в выходном файле.
> 
> Я пока совсем не знаю bash, даже на таком уровне...
> 
> -- 
> С уважением, Людмила
> 

-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Владимир Бажанов
Вот именно из таких соображений я однажды похожую задачу решил
открыванием файла openoffice calc и маленьким скриптом :)
Ибо "Большое знание приносит страх" (С) Футурама и знать всё полюбому не
получится. Или получится, но станете гиком :


В Вто, 10/08/2010 в 22:56 +0400, Людмила Бандурина пишет:

> 
> Да, за книгу спасибо, но для меня это пока как в анекдоте - "Я не хочу
> столько знать"...



-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Сергей Блохин
Опять отправил, не дописав...
Также порекомендую, по возможности, прочитать хорошую книгу 
http://www.opennet.ru/docs/RUS/bash_scripting_guide/ :)

10.08.2010, 20:54, "Сергей Блохин" :
> # awk -- это команда (программа), точнее микроязык для работы с текстом.
> # -F -- аргумент, который задаёт разделитель. В твоём случае -- это запятая. 
> Если не указывать разделитель, то по умолчанию им будет пробел.
> # {printf $1", "} -- код языка awk. В данном случае он выводит первый столбец 
> (до разделителя "запятая") и после него выводит запятую и пробел
> # infile -- имя входного файла (.csv).
> awk -F',' '{printf $1", "}' infile
>
> Выходной же файл не создаётся, а результат работы awk выводится в stdout, т. 
> е. в консоль.
> Ты можешь указать нужный тебе выходной файл, если в конце (после infile) 
> допишешь > outfile.
>
> Общий принцип таких программ простой. Если им жёстко не заданы входные и 
> выходные файлы, то они берут данные из stdin и отдают их в stdout (консоль).
> Например, можно сделать так:
> 1. cat infile | awk # будет обработан файл infile, а результат выведен в 
> консоль
> 2. cat infile | awk > outfile # будет обработа файл infile, а результат 
> записан в outfile
> 3. awk infile > outfile # # будет обработан файл infile, а результат выведен 
> в консоль
> и т. д.
>
> 10.08.2010, 20:31, "Людмила Бандурина" :
>
>>  10 августа 2010 г. 20:22 пользователь Andrew Bondarenko  
>> написал:
>>>  On 08/10/2010 08:17 PM, Andrew Bondarenko wrote:
  On 08/10/2010 08:02 PM, Людмила Бандурина wrote:
>  Здравствуйте,
>
>  Посоветуйте, пожалуйста, способ обработать .csv
>
>  Имеется:
>
>  "name1","name_eng1","code1","shortCode1"
>  "name2","name_eng2","code2","shortCode2"
>
>  И так далее, таких строк очень много
>
>  Нужно получить:
>
>  "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8",
>  "name9", "name10", "name11", "name12", "name13", "name14", "name15",
>  "name16",
>
>  И так далее - по 8 в строке, только первое поле из имеющихся в .csv
>  Или хотя бы в одну строку - но только первое поле.
>  Кавчки есть во входном файле, они должны быть и в выходном файле.
>
>  Я пока совсем не знаю bash, даже на таком уровне...
  Дак це ж гавка! =)

  awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1"," ;
  current++ ; } else { print $1"," ; current=1 ; } } ' infile

  где infile, как Вы понимаете, входной файл
>>>  хм... присмотрелся к "Нужно получить", у Вас там пробелы ещё, если
>>>  синтаксис гавки непонятен, то это будет так:
>>>
>>>  awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1", " ;
>>>  current++ ; } else { print $1", " ; current=1 ; } } ' infile
>>>
>>>  а что бы "хотя бы в одну строку" - это совсем просто:
>>>
>>>  awk -F',' ' { printf $1", " } ' infile
>>>
>>>  Всегда можете обратиться за пояснениями ;)
>>>
>>>  --
>>>  ubuntu-ru mailing list
>>>  ubuntu...@lists.ubuntu.com
>>>  https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru
>>  Обращаюсь за пояснением. Где здесь имя входного файла? А где имя файла на 
>> выходе?
>>
>>  --
>>  С уважением, Людмила
>>  --
>>  ubuntu-ru mailing list
>>  ubuntu...@lists.ubuntu.com
>>  https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru

-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Сергей Блохин
# awk -- это команда (программа), точнее микроязык для работы с текстом.
# -F -- аргумент, который задаёт разделитель. В твоём случае -- это запятая. 
Если не указывать разделитель, то по умолчанию им будет пробел.
#  {printf $1", "} -- код языка awk. В данном случае он выводит первый столбец 
(до разделителя "запятая") и после него выводит запятую и пробел
# infile -- имя входного файла (.csv).
awk -F',' '{printf $1", "}' infile

Выходной же файл не создаётся, а результат работы awk выводится в stdout, т. е. 
в консоль.
Ты можешь указать нужный тебе выходной файл, если в конце (после infile) 
допишешь > outfile.

Общий принцип таких программ простой. Если им жёстко не заданы входные и 
выходные файлы, то они берут данные из stdin и отдают их в stdout (консоль).
Например, можно сделать так:
1. cat infile | awk # будет обработан файл infile, а результат выведен в консоль
2. cat infile | awk > outfile # будет обработа файл infile, а результат записан 
в outfile
3. awk infile > outfile # # будет обработан файл infile, а результат выведен в 
консоль
и т. д.



10.08.2010, 20:31, "Людмила Бандурина" :
> 10 августа 2010 г. 20:22 пользователь Andrew Bondarenko  
> написал:
>> On 08/10/2010 08:17 PM, Andrew Bondarenko wrote:
>>> On 08/10/2010 08:02 PM, Людмила Бандурина wrote:
 Здравствуйте,

 Посоветуйте, пожалуйста, способ обработать .csv

 Имеется:

 "name1","name_eng1","code1","shortCode1"
 "name2","name_eng2","code2","shortCode2"

 И так далее, таких строк очень много

 Нужно получить:

 "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8",
 "name9", "name10", "name11", "name12", "name13", "name14", "name15",
 "name16",

 И так далее - по 8 в строке, только первое поле из имеющихся в .csv
 Или хотя бы в одну строку - но только первое поле.
 Кавчки есть во входном файле, они должны быть и в выходном файле.

 Я пока совсем не знаю bash, даже на таком уровне...

>>>
>>> Дак це ж гавка! =)
>>>
>>>
>>> awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1"," ;
>>> current++ ; } else { print $1"," ; current=1 ; } } ' infile
>>>
>>>
>>> где infile, как Вы понимаете, входной файл
>>>
>>>
>>
>> хм... присмотрелся к "Нужно получить", у Вас там пробелы ещё, если
>> синтаксис гавки непонятен, то это будет так:
>>
>> awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1", " ;
>> current++ ; } else { print $1", " ; current=1 ; } } ' infile
>>
>> а что бы "хотя бы в одну строку" - это совсем просто:
>>
>> awk -F',' ' { printf $1", " } ' infile
>>
>> Всегда можете обратиться за пояснениями ;)
>>
>> --
>> ubuntu-ru mailing list
>> ubuntu-ru@lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru
>
> Обращаюсь за пояснением. Где здесь имя входного файла? А где имя файла на 
> выходе?
>
> --
> С уважением, Людмила
> --
> ubuntu-ru mailing list
> ubuntu-ru@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru

-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Andrew Bondarenko
On 08/10/2010 08:31 PM, Людмила Бандурина wrote:
> 10 августа 2010 г. 20:22 пользователь Andrew Bondarenko  > написал:
>
> On 08/10/2010 08:17 PM, Andrew Bondarenko wrote:
>  > On 08/10/2010 08:02 PM, Людмила Бандурина wrote:
>  >> Здравствуйте,
>  >>
>  >> Посоветуйте, пожалуйста, способ обработать .csv
>  >>
>  >> Имеется:
>  >>
>  >> "name1","name_eng1","code1","shortCode1"
>  >> "name2","name_eng2","code2","shortCode2"
>  >>
>  >> И так далее, таких строк очень много
>  >>
>  >> Нужно получить:
>  >>
>  >> "name1", "name2", "name3", "name4", "name5", "name6", "name7",
> "name8",
>  >> "name9", "name10", "name11", "name12", "name13", "name14", "name15",
>  >> "name16",
>  >>
>  >> И так далее - по 8 в строке, только первое поле из имеющихся в .csv
>  >> Или хотя бы в одну строку - но только первое поле.
>  >> Кавчки есть во входном файле, они должны быть и в выходном файле.
>  >>
>  >> Я пока совсем не знаю bash, даже на таком уровне...
>  >>
>  >
>  > Дак це ж гавка! =)
>  >
>  >
>  > awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1"," ;
>  > current++ ; } else { print $1"," ; current=1 ; } } ' infile
>  >
>  >
>  > где infile, как Вы понимаете, входной файл
>  >
>  >
>
> хм... присмотрелся к "Нужно получить", у Вас там пробелы ещё, если
> синтаксис гавки непонятен, то это будет так:
>
> awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1", " ;
> current++ ; } else { print $1", " ; current=1 ; } } ' infile
>
>
> а что бы "хотя бы в одну строку" - это совсем просто:
>
> awk -F',' ' { printf $1", " } ' infile
>
> Всегда можете обратиться за пояснениями ;)
>
>
> --
> ubuntu-ru mailing list
> ubuntu-ru@lists.ubuntu.com 
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru
>
>
> Обращаюсь за пояснением. Где здесь имя входного файла? А где имя файла
> на выходе?
>
> --
> С уважением, Людмила
>

имя входного файла - последний параметр, в моем примере "infile"
Можно также использовать "конвейер", то есть отдавать содержимое файла 
на вход awk:

cat infile | awk -F ',' ' { ПРОГРАММА }'

выходной файл - стандартный вывод, то есть распечатает на экран. Именно 
файл всегда можно создать стандартными средствами, то есть 
перенаправлением вывода:

cat ВХОДНОЙ_ФАЙЛ | awk -F ',' ' { ПРОГРАММА }' > ВЫХОДНОЙ_ФАЙЛ



-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Andrew Bondarenko
On 08/10/2010 08:17 PM, Andrew Bondarenko wrote:
> On 08/10/2010 08:02 PM, Людмила Бандурина wrote:
>> Здравствуйте,
>>
>> Посоветуйте, пожалуйста, способ обработать .csv
>>
>> Имеется:
>>
>> "name1","name_eng1","code1","shortCode1"
>> "name2","name_eng2","code2","shortCode2"
>>
>> И так далее, таких строк очень много
>>
>> Нужно получить:
>>
>> "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8",
>> "name9", "name10", "name11", "name12", "name13", "name14", "name15",
>> "name16",
>>
>> И так далее - по 8 в строке, только первое поле из имеющихся в .csv
>> Или хотя бы в одну строку - но только первое поле.
>> Кавчки есть во входном файле, они должны быть и в выходном файле.
>>
>> Я пока совсем не знаю bash, даже на таком уровне...
>>
>
> Дак це ж гавка! =)
>
>
> awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1"," ;
> current++ ; } else { print $1"," ; current=1 ; } } ' infile
>
>
> где infile, как Вы понимаете, входной файл
>
>

хм... присмотрелся к "Нужно получить", у Вас там пробелы ещё, если 
синтаксис гавки непонятен, то это будет так:

awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1", " ; 
current++ ; } else { print $1", " ; current=1 ; } } ' infile


а что бы "хотя бы в одну строку" - это совсем просто:

awk -F',' ' { printf $1", " } ' infile

Всегда можете обратиться за пояснениями ;)


-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru


Re: Обработать .csv из командной строки

2010-08-10 Нитка Andrew Bondarenko
On 08/10/2010 08:02 PM, Людмила Бандурина wrote:
> Здравствуйте,
>
> Посоветуйте, пожалуйста, способ обработать .csv
>
> Имеется:
>
> "name1","name_eng1","code1","shortCode1"
> "name2","name_eng2","code2","shortCode2"
>
> И так далее, таких строк очень много
>
> Нужно получить:
>
> "name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8",
> "name9", "name10", "name11", "name12", "name13", "name14", "name15",
> "name16",
>
> И так далее - по 8 в строке, только первое поле из имеющихся в .csv
> Или хотя бы в одну строку - но только первое поле.
> Кавчки есть во входном файле, они должны быть и в выходном файле.
>
> Я пока совсем не знаю bash, даже на таком уровне...
>

Дак це ж гавка! =)


awk -F',' ' BEGIN { current=1 } { if (current<8) { printf $1"," ; 
current++ ; } else { print $1"," ; current=1 ; } } ' infile


где infile, как Вы понимаете, входной файл


-- 
ubuntu-ru mailing list
ubuntu-ru@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-ru