LINUX.ORG.RU

Как и чем выбрать записи из файла.


0

0

Есть файл вида:

one/two/three/four/five/six
1/2/3/4/5/6
6/5/4/3/2/1
4/5/6/7/8/9
Как мне из него выбрать несколько колонок по имени? например four five и six

надо чтобы была возможность выбора по имени, содержащемуся в первой строке файла.

По номеру поля не подходит. Поля постоянно меняются местами.

four/five/six
4/5/6
3/2/1
7/8/9

Спасибо.

★★

Ответ на: комментарий от swarnk
 1 #!/usr/bin/perl -w
 2 use strict;
 3 use Data::Dumper;
 4
 5 my $d = '/'; ##delimiter
 6 my $header = <>;
 7 chomp $header;
 8 my @titles = split $d => $header;
 9 my @want_title = qw[four five six];
10 my $n = 0;
11 my @cols = ();
12 foreach my $tl (@titles) {
13         if ( grep { $_ eq $tl } @want_title ) {
14                 push @cols => $n;
15         }
16         $n++;
17 }
18 while (<>) {
19         chomp;
20         my @string = split $d => $_;
21         print join($d, @string[@cols]), "\n";
22 }
 name_no@name_no_new: /tmp/test_cols $ cat file | ./perl.pl
2/5/6
5/2/1
5/8/9
name_no@name_no_new: /tmp/test_cols $ cat file
one/four/three/two/five/six
1/2/3/4/5/6
6/5/4/3/2/1
4/5/6/7/8/9

не самый оптимальный вариант, я полагаю

name_no ★★
()

скрипт придумывать лень, но смысл таков: читаешь весь файл построчно и пропускаешь через awk -F «/» задача awk-а - создать строки вида «four 4 3 7», «five 5 2 8» и т.д. потом уже выводишь нужные строки.

хотя мне не совсем понятно как это - поля постоянно меняются местами. обьсни если не сложно.

Komintern ★★★★★
()

Как-то так:

$ cat tst
one/two/three/four/five/six
1/2/3/4/5/6
6/5/4/3/2/1
4/5/6/7/8/9

$ awk -F'/' 'FNR==1{split($0,arr)} {for (val in arr) cur_arr[arr[val]]=$val; print cur_arr["four"],cur_arr["five"],cur_arr["six"]}' tst
four five six
4 5 6
3 2 1
7 8 9

gorilych ★★
()
Ответ на: комментарий от Komintern

Отвечу всем подряд:

name_no
Спасибо за perl скрипт!

Komintern
У меня сейчас эта задача решается на awk. Но я выбираю записи по номеру. print {'$1,$4,$6'} и т.д. Как мне их выбрать по именам, которые содержатся в первой строке пока не могу догадаться.

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

Как пришлют новый вариант, так я и давай скрипты переделывать. Но это же не дело.....

LamerOk
я вот только что, смотрел man cut, еще до того, как в ветку заглянул. Что то я туплю и не соображу как он мне может помочь?

swarnk ★★
() автор топика
Ответ на: комментарий от sdio

sdio спасибо что напомнил мне про еще одну мою ветку. У меня перегрев наверное случился с этими скриптами.

Тот же самый вопрос задаю....

Пардон и спасибо всем.

swarnk ★★
() автор топика
Ответ на: комментарий от swarnk

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

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

>Читай первую строку, определяй номер столбца
Как это проще сделать?


Cut мне может помочь только на конечном этапе. Когда я определил номера столбцов.

Я и спрашивал изначально - как мне определить эти самые номера, если столбцы постоянно меняются местами.

swarnk ★★
() автор топика

cut file -d "/" -f `head -1 file | tr "/" "\n" | grep -nE "four|five|six" | cut -d ":" -f 1 | tr "\n" "," | sed -e "s/,$//"`
но, имхо, на чем-нибудь еще будет проще)

xydo ★★
()
Ответ на: комментарий от xydo

правда, при наличии столбцов >12 возникнут проблемы с grep-ом))

xydo ★★
()
Ответ на: комментарий от xydo

Спасибо и вам xydo. Благодаря вам всем я надеюсь победить таки эти свои скрипты. Заодно уже перестал пугаться страшных регекспов. Если еще кто идей накидает буду премного благодарен!

swarnk ★★
() автор топика

сам номер выдери чем-то вроде sed/awk.
cat file | cut -d '/' -f номер(а)

AITap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.