Разделение файла на начало строки с использованием Unix - PullRequest
0 голосов
/ 18 ноября 2018

Мне нужно разделить файл с помощью Unix по первому тегу файла.

Исходный файл выглядит следующим образом:

TAG ANIMAL
A CAT
B CAT  
C CAT
D DOG
A DOG

Файлы результатов должны выглядеть следующим образом (после разделения):

Файл 1

TAG ANIMAL  
A CAT  
A DOG  

Файл 2

TAG ANIMAL  
B CAT  

Файл 3

TAG ANIMAL  
C CAT  

Файл 4

TAG ANIMAL  
D DOG  

Попытки: Я пробовал split -p Префикс имени файла, но это работает только для отсортированных данных и, таким образом, CAT & A DOG попадают в разные файлы. Я также получаю 3 других случайных файла из этого, которые не нужны.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Этот awk однострочный поможет вам:

awk 'NR==1{t=$0;next}!a[$1]{print t>$1}{print >>$1;a[$1]=1;close($1)}' file

Если мы протестируем ваш пример, после выполнения команды awk вы получите A,B,C,D четыре файла.

kent$  cat f
TAG ANIMAL
A CAT
B CAT  
C CAT
D DOG
A DOG

kent$  awk 'NR==1{t=$0;next}!a[$1]{print t>$1}{print >>$1;a[$1]=1;close($1)}' f

kent$  head {A..D}
==> A <==
TAG ANIMAL
A CAT
A DOG

==> B <==
TAG ANIMAL
B CAT  

==> C <==
TAG ANIMAL
C CAT

==> D <==
TAG ANIMAL
D DOG
0 голосов
/ 18 ноября 2018

Вы можете сделать это в Python, создав скрипт split_file.py следующим образом:

original_file = open('original_file.txt', 'r')
file_contents = []
for line in original_file:
    file_contents.append(line.split())

tags = {c[0] for c in file_contents[1:]}
for tag in tags:
    file_name = 'file_{}.txt'.format(tag)
    new_file = open(file_name, 'w')
    new_file.write('{} {}\n'.format(file_contents[0][0], file_contents[0][1]))
    for content in file_contents:
        if content[0] == tag:
            new_file.write('{} {}\n'.format(content[0], content[1]))

    new_file.close()

Этот сценарий предполагает, что ваш исходный файл называется original_file.txt, и он создаст новые файлы с именем file_<tag name>.txt.

Вы можете позвонить

python split_file.py

выполнить его.

0 голосов
/ 18 ноября 2018

попробуйте это.

 split [options] filename prefix

  it will split your file in unix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...