Bash Como posso quebrar o texto em um determinado número de entradas separadas por espaço

1

Eu tenho uma string longa como: "1 2 6 9 18 19 25 67 89 102 140 187" e quero dobrá-la ou envolvê-la após um número especificado de entradas ou espaços usando (por exemplo, dobra na terceira entrada) um número de caracteres, que varia.

    
por Jon 07.11.2015 / 23:32

3 respostas

0

Aqui está um script perl que dobra o stdin em palavras (ou seja, strings separadas por espaços). Você especifica o número de "palavras" na linha de comando.

Salve-o como, por exemplo, fold-words.pl e torne-o executável com chmod +x fold-words.pl

#! /usr/bin/perl 

use strict;

my $max = shift ;

while (<>) { 
    my $count = 0;
    foreach my $word (split) {
        print "$word " ;
        $count++ ;
        print "\n" if ($count % $max == 0)
    }
    print "\n" if ($count % $max != 0);
    $count=0;
}

Exemplo de saída:

$ echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12"  | ./fold-words.pl 3
1 2 6 
9 18 19 
25 67 89 
102 140 187 
99 12 

Note que é possível ter uma definição mais rigorosa (ou até bizarra) de "palavras" alterando o (split) para usar qualquer expressão regular arbitrária. por exemplo. (split /\t/) será dividido apenas em guias únicas, em vez do padrão "um ou mais caracteres de espaço em branco".

    
por 08.11.2015 / 00:35
0

Aqui está uma versão simples do awk; altere o 3 em %3 se você quiser um número diferente de campos por linha:

awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'

Execução da amostra:

$ str="one two three four five"
$ echo $str | awk '{ for(i=1; i<NF; i++) { printf $i OFS; if (i%3 == 0) { print "" }} printf $i}'
one two three
four five
    
por 08.11.2015 / 01:38
0

A resposta mais simples provavelmente é:

echo "1 2 6 9 18 19 25 67 89 102 140 187 99 12" | xargs -n 3
    
por 08.11.2015 / 22:18