Produto cartesiano de palavras em uma linha

1

Estou tendo um nome de arquivo de entrada 'a' que contém dados conforme abaixo:

BHARAT,SELXG,SAAB|ABCI
BHARAT,HONEY,HIRO,ABBS|XYZQ

Minha saída esperada é:

BHARAT|ABCI
SELXG|ABCI
SAAB|ABCI
BHARAT|XYZQ
HONEY|XYZQ
HIRO|XYZQ
ABBS|XYZQ

Eu usei: perl -pe 's/,/\n/g' a - que não está gerando o resultado esperado.

Alguém por favor pode me ajudar?

    
por Vishwa Ranjan 17.06.2017 / 12:33

3 respostas

4

Como você marcou sua pergunta como perl , veja algumas maneiras de fazer isso nesse idioma:

  1. dividir e participar

    $ perl -F'\|' -alne 'print join "|", $_, $F[1] for split ",", $F[0]' a
    BHARAT|ABCI
    SELXG|ABCI
    SAAB|ABCI
    BHARAT|XYZQ
    HONEY|XYZQ
    HIRO|XYZQ
    ABBS|XYZQ
    
  2. dividir e mapear

    $ perl -F'\|' -alne 'print for map { "$_|$F[1]" } split ",", $F[0]' a
    BHARAT|ABCI
    SELXG|ABCI
    SAAB|ABCI
    BHARAT|XYZQ
    HONEY|XYZQ
    HIRO|XYZQ
    ABBS|XYZQ
    
por steeldriver 17.06.2017 / 14:34
2

Pode ser alcançado de várias maneiras. Aqui está um liner usando awk

cat a | awk -F"[,|]" '{for (i=1;i<NF;i++) print $i"|"$NF}'

No terminal ,

$ cat a
BHARAT,SELXG,SAAB|ABCI
BHARAT,HONEY,HIRO,ABBS|XYZQ

$ cat a | awk -F"[,|]" '{for (i=1;i<NF;i++) print $i"|"$NF}'
BHARAT|ABCI
SELXG|ABCI
SAAB|ABCI
BHARAT|XYZQ
HONEY|XYZQ
HIRO|XYZQ
ABBS|XYZQ

Como funciona:

  • Lê uma linha com , e | como delimitador.
  • Imprime cada coluna em uma linha seguida pela última coluna nessa linha com | como delimitador.
por souravc 17.06.2017 / 12:56
1

Uma alternativa em python:

Em um verso:

python3 -c "for l in open('f'): d = l.strip().split('|');[print('|'.join([s, d[1]])) for s in d[0].split(',')]"

Onde 'f' é o caminho para o seu arquivo, em aspas (simples).

Saída:

BHARAT|ABCI
SELXG|ABCI
SAAB|ABCI
BHARAT|XYZQ
HONEY|XYZQ
HIRO|XYZQ
ABBS|XYZQ

Ou mais legível:

#!/usr/bin/env python3
import sys

# open the file
for l in open(sys.argv[1]):
    # remove spaces from the line(s), split by "|"
    d = l.strip().split('|')
    # list the first part of the line, join each of the items with the second part of the line
    [print('|'.join([s, d[1]])) for s in d[0].split(',')]

Para usar

  1. Copie o script em um arquivo vazio, salve-o como reorganize.py
  2. Execute-o pelo comando:

    python3 /path/to/reorganize.py /path/to/file_a
    

Explicação:

O script:

  • Abre o arquivo, lê-o por linha:

    for l in open(sys.argv[1]):
    
  • divide a linha pelo delimitador | , remove o \n

    d = l.strip().split('|')
    
  • divide a primeira parte pelo delimitador "," listando seus itens: d[0].split(',') e unindo cada um dos itens à última parte da linha: print('|'.join([s, d[1]])) :

    [print('|'.join([s, d[1]])) for s in d[0].split(',')]
    
por Jacob Vlijm 17.06.2017 / 14:23