У меня есть входное имя файла, который содержит данные как указано ниже:
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
- который не дает ожидаемый вывод.
Кто-то может выручить меня?
Это может быть достигнуто во многих отношениях. Вот один один лайнер с помощью 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
, Как он работает:
,
и с |
как разделитель. |
как разделитель. Так как Вы отметили свой вопрос perl
, вот несколько способов сделать это на том языке:
разделение и соединение
$ 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
разделение и карта
$ 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
В одном - лайнер:
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(',')]
Использовать
reorganize.py
Выполните его командой:
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(',')]