Tôi có một tệp lớn và cần chia thành hai tệp. Giả sử trong tệp đầu tiên, 1000 dòng nên được chọn và đưa vào tệp khác và xóa các dòng đó trong tệp đầu tiên.
Tôi đã thử sử dụng split
nhưng nó đang tạo ra nhiều khối.
Tôi có một tệp lớn và cần chia thành hai tệp. Giả sử trong tệp đầu tiên, 1000 dòng nên được chọn và đưa vào tệp khác và xóa các dòng đó trong tệp đầu tiên.
Tôi đã thử sử dụng split
nhưng nó đang tạo ra nhiều khối.
Câu trả lời:
Cách dễ nhất có lẽ là sử dụng head
và tail
:
$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2
Điều đó sẽ đưa 1.000 dòng đầu tiên từ input-file
vào output1
, và tất cả các dòng từ 1001 đến cuối nămoutput2
Tôi nghĩ rằng đó split
là cách tiếp cận tốt nhất của bạn.
Hãy thử sử dụng -l xxxx
tùy chọn, trong đó xxxx là số dòng bạn muốn trong mỗi tệp (mặc định là 1000).
Bạn có thể sử dụng -n yy
tùy chọn nếu bạn quan tâm hơn về số lượng tệp được tạo. Sử dụng -n 2
sẽ chia tệp của bạn chỉ trong 2 phần, bất kể số lượng dòng trong mỗi tệp.
Bạn có thể đếm số lượng dòng trong tệp của bạn với wc -l filename
. Đây là lệnh 'wordcount' với tùy chọn dòng.
man split
man wc
split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??
.
Đây là một công việc cho csplit
:
csplit -s infile 1001
sẽ s
tách ra một cách bất hợp pháp infile
, phần đầu tiên xx00
- lên đến nhưng không bao gồm dòng 1001 và phần thứ hai xx01
- các dòng còn lại.
Bạn có thể chơi với các tùy chọn nếu bạn cần các tên tệp đầu ra khác nhau, ví dụ như sử dụng -f
và chỉ định tiền tố :
csplit -sf piece. infile 1001
tạo ra hai tập tin có tên piece.00
vàpiece.01
Với một thông minh, head
bạn cũng có thể làm một cái gì đó như:
{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
csplit
. Rất đẹp. (Tôi chỉ đọc qua danh sách các lệnh POSIX và lúc đầu gặp rắc rối lớn csplit
với mục đích của lệnh. Hóa ra nó thực sự rất đơn giản.) :)
Một cách đơn giản để làm những gì câu hỏi yêu cầu, trong một lệnh:
awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile
hoặc, đối với những người bạn thực sự ghét phải gõ các lệnh dài, dễ hiểu bằng trực giác,
awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
split --help
chưa?