Divide a linha em pares de valores-chave com base na primeira string

6

Eu quero saber se existe uma maneira fácil de dividir uma linha em um arquivo em várias linhas, como esta:

Eu tenho

A B C
1 2 3 4

E eu quero algo assim, baseado na primeira string da linha:

A B
A C
1 2
1 3
1 4

Basicamente, com base na primeira string da linha, crie várias linhas com a segunda, terceira e quarta cadeia e assim por diante.

    
por Alex 07.01.2016 / 21:12

3 respostas

8

Aqui vai

awk '{for (i=2; i<=NF; ++i) print $1, $i}' file
A B
A C
1 2
1 3
1 4
    
por 07.01.2016 / 21:16
2

usando o bash -

    while read x ; do set $x ; first=$1 ; shift; for i in $* ; do echo $first  $1; shift; done  ; done  < /tmp/1
    A B
    A C
    1 2
    1 3
    1 4
    
por 08.01.2016 / 06:04
2
printf %s\n 'A B C' '1 2 3 4'|
sed -e's/\([^ ]*\)  *[^ ]*/&\n/;//P;D'
A B
A C
1 2
1 3
1 4

Isso funciona. Seleciona as duas primeiras seqüências de zero ou mais caracteres não espaciais, separados por um ou mais espaços. A primeira dessas sequências é referenciada em e toda a seleção em & . A seleção é substituída por ela mesma seguida por \n ewline e, em seguida, . O espaço padrão é então impresso até a primeira linha que está ocorrendo, e então a mesma parte é D eletida antes que o espaço padrão seja reciclado para o topo do script com o que resta.

Você pode ver o que faz com o comando l ook. Substitua o P w / l e coloque outro l antes do s/// ubstitution ...

A B C$
A B\nA C$
A C$
A C\nA$
A$
1 2 3 4$
1 2\n1 3 4$
1 3 4$
1 3\n1 4$
1 4$
1 4\n1$
1$
printf %s\n 'A B C' '1 2 3 4'|
sed -ne:t -e'/  *[^ ]*/{s//\n&/2;P;s///;} -ett
A B
A C
1 2
1 3
1 4

Ele corresponde a um espaço de padrão com pelo menos uma sequência de caracteres de espaço e qualquer espaço não-traçado. A primeira substituição insere uma nova linha antes da segunda ocorrência de tal sequência, então P rints até a nova linha, e a segunda substituição remove a primeira ocorrência desse padrão - que também incluirá agora a nova linha a primeira anexada à cauda daquela seqüência quando operando no segundo. O t est ramifica de volta para o rótulo :t cada vez que ocorre uma substituição e, portanto, sed consome espaço de padrão um campo separado por espaço de cada vez.

Com l ook novamente:

A B C$
A B\n C$
A C$
A C$
1 2 3 4$
1 2\n 3 4$
1 3 4$
1 3\n 4$
1 4$
1 4$
    
por 09.01.2016 / 18:17