Разделите строку цифр на 3 столбца, используя awk / sed - PullRequest
0 голосов
/ 21 января 2011

У меня есть строка цифр в строках, как показано ниже:

6390212345678912011012112121003574820069121409100000065471234567810
6390219876543212011012112221203526930428968109100000065478765432196

Что мне нужно разделить на 6 столбцов, как показано ниже:

639021234567891,201101211212100,3574820069121409,1000000,654712345678,10
639021987654321,201101211222120,3526930428968109,1000000,654787654321,96

Условия:

  • Поле 1 = 15 символов
  • Поле 2 = 15 символов
  • Поле 3 = 15 или 16 символов
  • Поле 4 = 7 символов
  • Поле 5 = 12 символов
  • Поле 6 = 2 символов

Окончательный результат:

639021234567891,3574820069121409,654712345678
639021987654321,3526930428968109,654787654321

Ответы [ 3 ]

1 голос
/ 21 января 2011

Или с помощью sed:

echo $NUM | sed -r 's/^([0-9]{16})([0-9]{15})([0-9]{15,16}) ...$/\1,\2,\3, .../'

Это будет использовать 15 или 16 для длины поля 3 на основе длины всей строки.

1 голос
/ 21 января 2011

Если вы используете gawk:

gawk -v f3w=16 'BEGIN {OFS=","; FIELDWIDTHS="15 15 " f3w " 7 12 2"} {print $1, $3, $5}'

Знаете ли вы заранее, какой должна быть ширина поля 3? Вам нужно, чтобы это было определено программно? Как? На основании общей длины линии? Меняется ли построчно?

Edit:

Если у вас нет gawk, то это аналогичный подход:

awk -v f3w=16 'BEGIN {OFS=","; FIELDWIDTHS="15 15 " f3w " 7 12 2"; n=split(FIELDWIDTHS,fw," ")} { p=1; r=$0; for (i=1;i<=n;i++) { $i=substr(r,p,fw[i]); p += fw[i]}; print $1,$3,$5}'
1 голос
/ 21 января 2011

Не ясно, как определить, должно ли поле 3 иметь 15 или 16 символов.Но в качестве черновика для первых 3 полей вы можете использовать что-то вроде этого:

     echo 63902910069758520110121121210035748200670169758510 |
 awk '{ printf("%s,%s,%s",substr($1,1,15),substr($1,16,15),substr($1,30,15)); }'
...