파일 분할: `sed`에서 `egrep`을 대체합니다.

파일 분할: `sed`에서 `egrep`을 대체합니다.

내 것을 나누고 싶다$파일포함하는엑스줄을 반으로 나누고 "가 포함된 줄 수를 확인하세요.죽은"를 로그에 기록했습니다. 나는 다음과 같이 시작했습니다.

half=`expr $(egrep -c . $file) / 2`

sed -n 1,${half}p $file | 
    xargs echo $file $half $(egrep -c dead $I) > log_1
sed -n ${half},${egrep -c . $file}p | 
    xargs echo $file $half $(egrep -c dead $I) > log_2

첫 번째 sed명령의 출력은 정상이지만 egrep범위를 대체하면 sed잘못됩니다.

DeadOrAlive 5 2
-bash: ${half},${egrep -c . $file}p: bad substitution

파일을 분할하는 더 효율적인 방법이 있습니까 bash?

답변1

  1. wc, headtail: 사용

    half=$(( $(wc -l "$file")/2 ))
    head -$half | egrep -c dead | xargs echo "$file" $half > log_1
    tail -$half | egrep -c dead | xargs echo "$file" $half > log_2
    
  2. 사용 split:

    split -a1 --numeric-suffixes=1 -n 'l/2' "$file" "$file"_
    echo "$file" "$file"_1 $(egrep -c dead "$file_1") > log_1
    echo "$file" "$file"_2 $(egrep -c dead "$file"_2) > log_2
    rm "$file"_[12]
    

답변2

Awk 솔루션은 다음과 같습니다.

awk '/dead/ { a[++n] = NR }
    END { for (i=1; i<=n; i++) if (a[i] > NR/2) break
        print ARGV, int(NR/2), i-1 >"log_1";
        print ARGV, int(NR/2)+(int(NR/2)!=NR/2), n-i+1 >"log_2" }' file

a일치하는 줄 번호를 배열에 수집합니다 . 그런 다음 배열의 줄 번호 중 가장 가운데 줄보다 작은 줄 번호가 몇 개인지 알아냅니다. 해당 개수는 첫 번째 파티션에 할당됩니다. ( 루프에서 벗어날 i-1때 이미 분할 지점을 지나갔기 때문에 사용해야 합니다 .)break

일반적으로 동일한 파일을 여러 번 다시 읽는 것을 피하고 싶을 것입니다. 특히 파일이 클 경우에는 더욱 그렇습니다. 둘째, 프로세스 수를 최소화하려고 노력하십시오.

중간 출력 필드에 무엇을 포함할지 명확하지 않습니다. 파일에 홀수 줄이 포함되어 있으면 첫 번째 "절반"에는 두 번째 파티션보다 한 줄 적습니다. (변경하기는 어렵지 않지만 어느 쪽이든 결정해야 합니다.)

관련 정보