developer tip

개별 줄을 끊지 않고 파일을 동일한 부분으로 분할하는 방법은 무엇입니까?

copycodes 2020. 8. 20. 19:00
반응형

개별 줄을 끊지 않고 파일을 동일한 부분으로 분할하는 방법은 무엇입니까? [복제]


줄을 끊지 않고 파일을 동일한 부분으로 분할 할 수 있는지 궁금합니다 ( 편집 : = 마지막을 제외하고 모두 동일)? 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).

그러면 중간 선 분할없이 크기면에서 거의 동일한 파일이 제공됩니다.

마지막 요점 은 각 파일에서 대략 같은 수의 제공하지 않고 더 많은 문자 수를 제공하기 때문입니다 .

So, if you have one 20-character line and 19 1-character lines (twenty lines in total) and split to five files, you most likely won't get four lines in every file.


The script isn't even necessary, split(1) supports the wanted feature out of the box:
split -l 75 auth.log auth.log. The above command splits the file in chunks of 75 lines a piece, and outputs file on the form: auth.log.aa, auth.log.ab, ...

wc -l on the original file and output gives:

  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 was updated in coreutils release 8.8 (announced 22 Dec 2010) with the --number option to generate a specific number of files. The option --number=l/n generates n files without splitting lines.

http://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html#split-invocation http://savannah.gnu.org/forum/forum.php?forum_id=6662


A simple solution for a simple question:

split -n l/5 your_file.txt

no need for scripting here.

From the man file, CHUNKS may be:

l/N     split into N files without splitting lines

Update

Not all unix dist include this flag. For example, it will not work in OSX. To use it, you can consider replacing the Mac OS X utilities with GNU core utilities.


I made a bash script, that given a number of parts as input, split a file

#!/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*

I used head and tail commands, and store in tmp files, for split the files

#10 means 10 parts
sh mysplitXparts.sh input_file 10

or with awk, where 0.1 is 10% => 10 parts, or 0.334 is 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

반응형