source

각 행을 구분하지 않고 파일을 동일한 부분으로 분할하려면 어떻게 해야 합니까?

gigabyte 2023. 4. 14. 21:47
반응형

각 행을 구분하지 않고 파일을 동일한 부분으로 분할하려면 어떻게 해야 합니까?

파일을 줄 바꿈 없이 등분(편집: = 마지막을 제외하고 모두 동일)할 수 있을까요?Unix 에서 split 명령어를 사용하면 행이 반으로 분할될 수 있습니다.예를 들어, 파일을 5등분할 수 있지만, 여전히 전체 행으로 구성되는 방법이 있습니까(파일이 조금 크거나 작더라도 문제 없습니다).줄 수만 계산할 수 있지만 bash 스크립트의 많은 파일에 대해 이 작업을 수행해야 합니다.감사합니다!

줄의 수가 같으면 split에는 다음과 같은 옵션이 있습니다.

split --lines=75

그게 뭔지 알고 싶다면75을 위한 것이어야 한다N동일한 부품, 그:

lines_per_part = int(total_lines + N - 1) / N

로 총선을 얻을 수 있습니다.wc -l.

예에 대해서는, 다음의 스크립트를 참조해 주세요.

#!/usr/bin/bash

# Configuration stuff

fspec=qq.c
num_files=6

# Work out lines per file.

total_lines=$(wc -l <${fspec})
((lines_per_file = (total_lines + num_files - 1) / num_files))

# Split the actual file, maintaining lines.

split --lines=${lines_per_file} ${fspec} xyzzy.

# Debug information

echo "Total lines     = ${total_lines}"
echo "Lines  per file = ${lines_per_file}"    
wc -l xyzzy.*

출력은 다음과 같습니다.

Total lines     = 70
Lines  per file = 12
  12 xyzzy.aa
  12 xyzzy.ab
  12 xyzzy.ac
  12 xyzzy.ad
  12 xyzzy.ae
  10 xyzzy.af
  70 total

의 최신 버전split의 수를 지정할 수 있습니다.CHUNKS와 함께-n/--number선택.따라서 다음과 같은 것을 사용할 수 있습니다.

split --number=l/6 ${fspec} xyzzy.

(그것은ell-slash-six,의미.lines,것은 아니다.one-slash-six).

따라서 중간 줄 분할 없이 파일 크기가 거의 동일합니다.

마지막 포인트는 각 파일의 줄 가 거의 동일하지 않고 글자 수가 동일하기 때문에 언급합니다.

따라서 1개의 20자 행과 19개의 1자 행(총 20개 행)이 있고 5개의 파일로 분할되어 있는 경우, 대부분의 경우 모든 파일에 4개의 행이 포함되어 있지 않습니다.

스크립트는 필요 없습니다.split (1)은 필요한 기능을 즉시 지원합니다.
split -l 75 auth.log auth.log.위의 명령어는 파일을 75줄의 청크로 분할하여 다음 형식으로 파일을 출력합니다.auth.log.aa, auth.log.ab, ...

wc -l다음 정보를 얻을 수 있습니다.

  321 auth.log
   75 auth.log.aa
   75 auth.log.ab
   75 auth.log.ac
   75 auth.log.ad
   21 auth.log.ae
  642 total

간단한 질문에 대한 간단한 솔루션:

split -n l/5 your_file.txt

여기서 설명하지 않아도 됩니다.

파일에서CHUNKS may be:

l/N     split into N files without splitting lines

갱신하다

모든 unix dist에 이 플래그가 포함되어 있는 것은 아닙니다.예를 들어 OSX에서는 동작하지 않습니다.이를 사용하기 위해 Mac OS X 유틸리티를 GNU 코어 유틸리티로 교체하는 것을 고려할 수 있습니다.

split은 특정 개수의 파일을 생성하기 위해 --number 옵션을 사용하여 coreutils 릴리스 8.8(2010년 12월 22일 발표)에서 업데이트되었습니다.--number=l/n 옵션은 행을 분할하지 않고 n개의 파일을 생성합니다.

코어유틸리티 매뉴얼

여러 부분을 입력으로 주고 파일을 분할하는 bash 스크립트를 만들었습니다.

#!/bin/sh

parts_total="$2";
input="$1";

parts=$((parts_total))
for i in $(seq 0 $((parts_total-2))); do
  lines=$(wc -l "$input" | cut -f 1 -d" ")
  #n is rounded, 1.3 to 2, 1.6 to 2, 1 to 1
  n=$(awk  -v lines=$lines -v parts=$parts 'BEGIN { 
    n = lines/parts;
    rounded = sprintf("%.0f", n);
    if(n>rounded){
      print rounded + 1;
    }else{
      print rounded;
    }
  }');
  head -$n "$input" > split${i}
  tail -$((lines-n)) "$input" > .tmp${i}
  input=".tmp${i}"
  parts=$((parts-1));
done
mv .tmp$((parts_total-2)) split$((parts_total-1))
rm .tmp*

하였습니다.head ★★★★★★★★★★★★★★★★★」tail 및 파일에 tmp 파일)

#10 means 10 parts
sh mysplitXparts.sh input_file 10

또는 awk를 사용하여 0.1은 10% => 10 parts 또는 0.334는 3 parts입니다.

awk -v size=$(wc -l < input) -v perc=0.1 '{
  nfile = int(NR/(size*perc)); 
  if(nfile >= 1/perc){
    nfile--;
  } 
  print > "split_"nfile
}' input
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in"

언급URL : https://stackoverflow.com/questions/7764755/how-to-split-a-file-into-equal-parts-without-breaking-individual-lines

반응형