Разбиение файла по строке начинается с Unix

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

Оригинальный файл выглядит так:

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

Файлы результатов должны выглядеть так (post split):

Файл 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 ответа


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

 split [options] filename prefix

  it will split your file in unix

Этот awk-вкладыш поможет вам:

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

Если мы проверим ваш пример, после выполнения awk cmd вы получите четыре файла 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

Вы можете сделать это на 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('{} {}
'.format(file_contents[0][0], file_contents[0][1]))
    for content in file_contents:
        if content[0] == tag:
            new_file.write('{} {}
'.format(content[0], content[1]))

    new_file.close()

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

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

python split_file.py

для его выполнения.


Есть идеи?

10000