Divide um arquivo em dois arquivos em uma determinada linha

9

Estou procurando uma maneira no unix de dividir um arquivo em dois arquivos em um determinado número de linha.

split -l 100 file_name está próximo do que estou procurando, mas esse comando cria vários arquivos, cada um com 100 linhas. Eu estou procurando um comando para dividir um arquivo em dois arquivos em um determinado número de linha. Existe uma maneira de fazer isso no unix?

    
por turtle 25.07.2013 / 19:40

6 respostas

10

Uma solução mais restrita:

(head -100 > f1.txt; cat > f2.txt) < input.txt
    
por 25.07.2013 / 19:58
6

Use awk , para que você precise fazer apenas uma passagem pelo arquivo de entrada. Os seguintes assume que você deseja as primeiras 122 linhas no primeiro arquivo e o restante no segundo.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name
    
por 25.07.2013 / 19:53
5

Você pode usar head e tail para obter as duas partes:

head -n K file_name > top_file
tail -n L file_name > bottom_file

em que K é o número da linha e L é o número de linhas da parte inferior (número total de linhas - K ).

(você pode obter o número total de linhas usando wc -l file_name ).

    
por 25.07.2013 / 19:48
4

Tanto o head quanto o tail têm opções para produzir linhas a partir da extremidade "do outro" do arquivo, do contrário, caso contrário. Então você tem essas duas opções:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

ou (onde NNN é 100 menor que a saída de wc -l source.txt ):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Você pode ler as páginas de manual de suas versões de head e tail para obter mais informações.

    
por 25.07.2013 / 20:10
3

Você pode usar csplit (se disponível) para fazer isso:

csplit file N+1

dividirá o arquivo em duas partes, uma parte até (e incluindo) o número da linha N e a outra parte do número da linha N+1 até a última linha.
Se você quiser dividir (mas não incluindo) o número da linha N :

csplit file N
    
por 21.12.2014 / 19:50
0

Você pode usar 'wc', 'dc', 'head' e 'tail'. Ou seja,

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Para facilidade de uso, você pode transformar acima em um script de shell.

    
por 25.07.2013 / 20:05

Tags