분할 명령을 사용하여 텍스트 파일을 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
추가된 행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
사람들은 멍청하고 어떻게 해야 할지 모르 더라도표준 준수따라서 이것은 모든 설정에서 작동하지 않습니다 ...
답변3
{ 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
파일이 크면 a가 count=1 bs=$big_ol_num
약간 다루기 어려워질 수 있으며 이는 추가(그러나 간단한) 쉘 계산을 통해 방지할 수 있습니다.
파이프 등에서 검색할 수 없는 입력은 결과를 왜곡할 수 있지만 이는 dd
GNU 에서도 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