스플릿 : 다른 백분율로 나누는 방법?


14

split 명령을 사용하여 텍스트 파일을 70 % 및 30 %로 분할하려면 어떻게해야합니까?


split 명령을 사용 했습니까? 그렇지 않으면 펄이나 파이썬을 사용하여 직선 텍스트 조작으로 쉽게 할 수 있습니다. 파일이 너무 잘못되지 않는 한, 메모리에서 파일을 문자열로 읽은 다음 문자열을 분할하십시오. 파일이 너무 크면 더 많은 작업이 필요합니다.
Faheem Mitha

@Faheem Mitha 파일은 64MB입니다. 코드를 작성하는 것보다 빠르기 때문에 split을 사용하는 것이 좋습니다. 파일의 70 %에 해당하는 줄 수를 지정하면 큰 파일과 작은 파일을 얻습니다. 작동하지 않습니까?
aneuryzm

그리고 예 .. 효과가있었습니다. 질문을 삭제해야합니까?
aneuryzm

당신에게 달려 있지만 꼭 필요한 것은 아닙니다.
Faheem Mitha

답변:


13

아래의 명령은 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

1
MacOSX에서 wc는 때때로 공백을 가진 줄 수를 반환합니다. xargs로 처음 배관하면 해당 공간이 제거되고 다시 작동합니다. split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Emil Stenström

4

csplit첫 번째 조각-첫 번째 20 % 선, 두 번째 조각-나머지 80 % 선으로 두 조각으로 나눌 수 있습니다 (예 : 백분율을 사용).

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

$(wc -l < infile): 총 줄 수
2 / 10: 백분율
+1: csplit나누기 때문에 한 줄 추가up 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는 멍청하고 표준을 준수 하지 않으므로 모든 설정에서 작동하지는 않습니다 ...


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

... 한 번만 나누기 때문에이 간단한 경우에 효과가 있어야합니다 split. 아마도 약간 과잉 일 것 입니다. 그래서 긴 파일이 시크 한, dd단 하나 할 것입니다 read()에를 <stdin너무하고 cat그것을 시작하기 위해 남아있는 read()어떤 점에서 dd그것은 잎.

파일이 크면 count=1 bs=$big_ol_num약간 다루기 어려울 수 있으며 추가-간단한 쉘 수학으로 차단 될 수 있습니다.

파이프에서와 같이 검색 할 수없는 입력이 왜곡 될 수 있음 dd '이 / GNU W : 음으로 처리 할 수 있지만,의 결과 dd들' iflag=fullblock.


0

다음 코드 는 모든 비율 (이 경우 40-60)을 사용 head하고 tail작동합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.