Декартово произведение слов в строке

У меня есть входное имя файла, который содержит данные как указано ниже:

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

Мой ожидаемый вывод:

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

Я использовал: perl -pe 's/,/\n/g' a - который не дает ожидаемый вывод.

Кто-то может выручить меня?

1
задан 18 June 2017 в 01:55

3 ответа

Это может быть достигнуто во многих отношениях. Вот один один лайнер с помощью awk

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

В терминале ,

$ 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

, Как он работает:

  • Чтения строка и с , и с | как разделитель.
  • Печать каждый столбец, подряд сопровождаемый последним столбцом в той строке с | как разделитель.
2
ответ дан 3 December 2019 в 06:24

Так как Вы отметили свой вопрос perl, вот несколько способов сделать это на том языке:

  1. разделение и соединение

    $ 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. разделение и карта

    $ 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
    
4
ответ дан 3 December 2019 в 06:24

Альтернатива Python:

В одном - лайнер:

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

Где 'f' путь к Вашему файлу, в (единственных) кавычках.

Вывод:

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

Или более читаемый:

#!/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(',')]

Использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как reorganize.py
  2. Выполните его командой:

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

Объяснение:

Сценарий:

  • Открывает файл, чтения это на строку:

    for l in open(sys.argv[1]):
    
  • разделяет строку разделителем |, удаляет запаздывание \n

    d = l.strip().split('|')
    
  • разделяет первую часть разделителем"", перечисляя его объекты: d[0].split(','), и присоединение к каждому из объектов с последней частью строки: print('|'.join([s, d[1]])):

    [print('|'.join([s, d[1]])) for s in d[0].split(',')]
    
1
ответ дан 3 December 2019 в 06:24

Другие вопросы по тегам:

Похожие вопросы: