분할: 다른 백분율로 분할하는 방법은 무엇입니까?

분할: 다른 백분율로 분할하는 방법은 무엇입니까?

분할 명령을 사용하여 텍스트 파일을 70%와 30%로 분할하는 방법은 무엇입니까?

답변1

아래 명령은 50% 이상의 백분율에 대해 작동합니다(두 개의 파일로 분할하려는 경우). 여기에 빠르고 더러운 방법이 있습니다.

1) 선에 따라 70% 분할

split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename 

2) 바이트 기준으로 70% 분할

split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename

답변2

csplit예를 들어 첫 번째 부분 - 행의 처음 20%, 두 번째 부분 - 행의 나머지 80%와 같이 두 부분(백분율 사용)으로 분할 할 수 있습니다 .

csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))

$(wc -l < infile):총 행 수 :Percent:
2 / 10분할로 인해
+1추가된 행csplitup to but not including line N

그러나 선을 기준으로만 분할할 수 있습니다.
기본적으로 줄 번호만 있으면 $(( $(wc -l < file) * 2 / 10))모든 줄 기반 도구를 사용할 수 있습니다.

sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile

또는 더 멋진 방법은 다음과 같습니다.

{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile

어떤 head사람들은 멍청하고 어떻게 해야 할지 모르 더라도표준 준수따라서 이것은 모든 설정에서 작동하지 않습니다 ...

답변3

{   BS=$(($(wc -c <file) * $P / 100))
    dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null

...한 번만 분할하기 때문에 이 간단한 경우에 작동합니다. 따라서 split약간 과잉일 수 있습니다. 파일을 검색할 수 있는 한 한 번만 실행되므로 dd떠날 때마다 시작됩니다.read()<stdincatread()dd

파일이 크면 a가 count=1 bs=$big_ol_num약간 다루기 어려워질 수 있으며 이는 추가(그러나 간단한) 쉘 계산을 통해 방지할 수 있습니다.

파이프 등에서 검색할 수 없는 입력은 결과를 왜곡할 수 있지만 이는 ddGNU 에서도 dd처리 할 수 있습니다 iflag=fullblock.

답변4

다음 코드 에서는 head임의의 tail배율(이 경우 40~60)을 사용합니다.

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

관련 정보