Uma solução mais restrita:
(head -100 > f1.txt; cat > f2.txt) < input.txt
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?
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
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
).
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.
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
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.
Tags unix