Разделить определенные столбцы - PullRequest
1 голос
/ 03 января 2012

У меня есть такой вид:

1 2 12345
2 4 98231
...

Мне нужно разделить третий столбец на подстолбцы, чтобы получить его (например, разделенный пробелом):

1 2 1 2 3 4 5
2 4 9 8 2 3 1

Кто-нибудь может предложить мне хорошее решение в sed, awk, ... и т. Д.? Спасибо!

РЕДАКТИРОВАТЬ: размер исходного третьего столбца может варьироваться запись для записи.

Ответы [ 7 ]

6 голосов
/ 03 января 2012

Awk

% echo '1 2 12345
2 4 98231
...' | awk '{
    gsub(/./, "& ", $3)
    print
}
'
1 2 1 2 3 4 5
2 4 9 8 2 3 1
...

[Протестировано с GNU Awk 3.1.7]

Это берет каждый символ (/./) в третьем столбце ($3) и заменяет (gsub()) перед собой выводится пробел ("& ") перед печатью всей строки.

3 голосов
/ 03 января 2012

Sed solution:

sed -e 's/\([0-9]\)/\1 /g' -e 's/ \+/ /g'

Первое выражение sed заменяет каждую цифру той же цифрой, за которой следует пробел.Второе выражение заменяет каждый блок пробелов одним пробелом, таким образом обрабатывая двойные пробелы, введенные предыдущим выражением.С не-GNU seds вам может понадобиться два вызова sed (по одному для каждого -e).

2 голосов
/ 03 января 2012

Использование awk substr и printf:

[srikanth@myhost ~]$ cat records.log 
1 2 12345 6 7
2 4 98231 8 0

[srikanth@myhost ~]$ awk '{ len=length($3); for(i=1; i<=NF; i++) { if(i==3) { for(j = 1; j <= len; j++){ printf substr($3,j,1) " "; } } else { printf $i " "; } } printf("\n"); }' records.log 
1 2 1 2 3 4 5 6 7 
2 4 9 8 2 3 1 8 0 

Вы также можете использовать это для более чем трех записей столбцов.

2 голосов
/ 03 января 2012

Использование perl:

perl -pe 's/([0-9])(?! )/\1 /g' INPUT_FILE

Тест:

[jaypal:~/Temp] cat tmp
1 2 12345
2 4 98231
[jaypal:~/Temp] perl -pe 's/([0-9])(?! )/\1 /g' tmp
1 2 1 2 3 4 5 
2 4 9 8 2 3 1 

Использование gnu sed:

sed 's/\d/& /3g' INPUT_FILE

Тест:

[jaypal:~/Temp] sed 's/[0-9]/& /3g' tmp
1 2 1 2 3 4 5 
2 4 9 8 2 3 1 

Использование gnu awk:

gawk '{print $1,$2,gensub(/./,"& ","G", $NF)}' INPUT_FILE

Тест:

[jaypal:~/Temp] gawk '{print $1,$2,gensub(/./,"& ","G", $NF)}' tmp
1 2 1 2 3 4 5 
2 4 9 8 2 3 1 
1 голос
/ 03 января 2012
$ awk -F '' '$1=$1' data.txt | tr -s ' '
1 2 1 2 3 4 5
2 4 9 8 2 3 1
1 голос
/ 03 января 2012

Если вам не нужны пробелы, это краткая версия:

sed 's/[0-9]/& /g'

но если вам нужно удалить пробелы, мы просто добавим еще одно регулярное выражение:

sed 's/[0-9]/& /g;s/   */ /g'

Обратите внимание, что это совместимо с оригинальным sed, поэтому будет работать на любом UNIX-подобном.

0 голосов
/ 03 января 2012

Это может работать для вас:

echo -e "1 2 12345\n2 4 98231" | sed 's/\B\s*/ /g'
1 2 1 2 3 4 5
2 4 9 8 2 3 1

Скорее всего, только GNU sed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...