Làm cách nào tôi có thể chia tệp văn bản thành 70% và 30% bằng lệnh split?
Làm cách nào tôi có thể chia tệp văn bản thành 70% và 30% bằng lệnh split?
Câu trả lời:
Các lệnh dưới đây sẽ hoạt động với tỷ lệ phần trăm trên 50% (nếu bạn chỉ muốn chia thành hai tệp), cách tiếp cận nhanh và bẩn.
1) chia 70% dựa trên các dòng
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) phân chia 70% dựa trên byte
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Bạn có thể sử dụng csplit
để chia thành hai phần (sử dụng bất kỳ tỷ lệ phần trăm nào), ví dụ: phần đầu tiên - 20% dòng đầu tiên, phần thứ hai - 80% dòng còn lại:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: tổng số dòng
2 / 10
: phần trăm
+1
: thêm một dòng vì csplit
chia táchup to but not including line N
Bạn chỉ có thể phân chia dựa trên các dòng mặc dù.
Về cơ bản, miễn là bạn có số dòng thông qua $(( $(wc -l < file) * 2 / 10))
bạn có thể sử dụng bất kỳ công cụ định hướng dòng nào:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
hoặc, thậm chí mát hơn:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
mặc dù một số head
người câm và sẽ không tuân thủ các tiêu chuẩn nên điều này sẽ không hoạt động trên tất cả các thiết lập ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... nên hoạt động cho trường hợp đơn giản này vì bạn chỉ chia tách một lần - và vì vậy có lẽ split
là hơi quá mức. Vì vậy, miễn là các tập tin là seekable, dd
sẽ chỉ làm một single read()
trên <stdin
, và vì vậy cat
còn lại để bắt đầu của nó read()
ở bất cứ điểmdd
lá nó.
Nếu tệp lớn thì count=1 bs=$big_ol_num
có thể hơi khó sử dụng và nó có thể bị chặn với một số phép toán bổ sung - nhưng đơn giản -.
Một đầu vào phi seekable - như từ một đường ống - có thể nghiêng dd
'kết quả s, mặc dù điều này có thể được xử lý như cũng w / GNU dd
' s iflag=fullblock
.
Đoạn mã sau sử dụng head
và tail
hoạt động với bất kỳ tỷ lệ nào (40 đến 60 trong trường hợp này):
export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw