Используйте Awk, чтобы напечатать каждый символ как отдельный столбец? - PullRequest
3 голосов
/ 08 апреля 2010

Мне нужна реорганизация большого файла CSV. Первый столбец, который в настоящее время представляет собой 6-значное число, необходимо разделить, используя запятые в качестве разделителя полей.

Например, мне нужно это:

022250,10:50 AM,274,22,50
022255,11:55 AM,275,22,55

превратился в это:

0,2,2,2,5,0,10:50 AM,274,22,50
0,2,2,2,5,5,11:55 AM,275,22,55

Дайте мне знать, что вы думаете!

Спасибо!

Ответы [ 4 ]

3 голосов
/ 08 апреля 2010

Это намного короче в Perl:

perl -F, -ane '$,=","; print split("",$F[0]), @F[1..$#F]' <file>

Поскольку вы не знаете Perl, быстрое объяснение.-F, указывает, что разделитель поля ввода - это запятая (например, awk).-a активирует автоматическое разделение (в массив @F), -n неявно оборачивает код в цикл while (<>) { ... }, который считывает входные данные построчно.-e указывает, что следующим аргументом является скрипт для запуска.$, - разделитель выходного поля (таким образом он получает заданную итерацию цикла, ну да ладно).split имеет очевидную цель, и вы можете видеть, как массив индексируется / разрезается.print, когда списки в качестве аргументов подобны этому, использует разделитель выходных полей и печатает все их поля.

В awk:

awk -F, '{n=split($1,a,""); for (i=1;i<=n;i++) {printf("%s,",a[i])}; for (i=2;i<NF;i++) {printf("%s,",$i)}; print $NF}' <file>
2 голосов
/ 08 апреля 2010

вот еще один способ в awk

$ awk -F"," '{gsub(".",",&",$1);sub("^,","",$1)}1' OFS="," file
0,2,2,2,5,0,10:50 AM,274,22,50
0,2,2,2,5,5,11:55 AM,275,22,55
2 голосов
/ 08 апреля 2010

Я думаю, это может сработать.Функция split (по крайней мере, в версии, которую я использую) разбивает значение на отдельные символы, если третий параметр - пустая строка.

1 голос
/ 08 апреля 2010

Вот вариант по теме. Следует отметить, что он печатает оставшиеся поля без использования цикла. Другое заключается в том, что, поскольку вы в любом случае перебираете символы в первом поле, почему бы просто не сделать это без использования функции разделителя нулей в split () (которая может отсутствовать в некоторых версиях AWK):

awk -F, 'BEGIN{OFS=","} {len=length($1); for (i=1;i<len; i++) {printf "%s,", substr($1,i,1)}; printf "%s", substr($1,len,1);$1=""; print $0}' filename

Как скрипт:

BEGIN {FS = OFS = ","}
{
    len = length($1); 
    for (i=1; i<len; i++)
        {printf "%s,", substr($1, i, 1)}; 
    printf "%s", substr($1, len, 1)
    $1 = "";
    print $0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...