쉘 스크립트: 변수 올바른 형식

쉘 스크립트: 변수 올바른 형식

변수를 작성하는 방법을 모르겠습니다.sed

그래서 for 루프를 사용하여 다음 작업을 수행하고 싶습니다.

sed -n '1,200p' big_file.txt > 1to200.txt
sed -n '201,400p' big_file.txt > 201to400.txt
sed -n '401,600p' big_file.txt > 401to600.txt
sed -n '601,800p' big_file.txt > 601to800.txt
sed -n '801,1000p' big_file.txt > 801to1000.txt
sed -n '1001,1200p' big_file.txt > 1001to1200.txt
sed -n '1201,1400p' big_file.txt > 1201to1400.txt
sed -n '1401,1600p' big_file.txt > 1401to1600.txt
sed -n '1601,1800p' big_file.txt > 1601to1800.txt
sed -n '1801,2000p' big_file.txt > 1801to2000.txt
sed -n '2001,2200p' big_file.txt > 2001to2200.txt
sed -n '2201,2400p' big_file.txt > 2201to2400.txt
sed -n '2401,2600p' big_file.txt > 2401to2600.txt
sed -n '2601,2800p' big_file.txt > 2601to2800.txt
sed -n '2801,3000p' big_file.txt > 2801to3000.txt
sed -n '3001,3200p' big_file.txt > 3001to3200.txt
sed -n '3201,3400p' big_file.txt > 3201to3400.txt
sed -n '3401,3600p' big_file.txt > 3401to3600.txt
sed -n '3601,3800p' big_file.txt > 3601to3800.txt
sed -n '3801,4000p' big_file.txt > 3801to4000.txt

내가 시도한 것:

j=0
for ((i=1;i<=3801;i=$i+200))
do
    #echo $m,$n
    j=$j + 200
    sed -n '$i,$j p' big_file.txt  > $ito$j.txt 
done

이 일을 도와주세요. 설명도 부탁드립니다.

답변1

sed를 호출하는 대신 단일 awk 프로그램으로 이 작업을 수행하겠습니다.N타임스

awk '
    BEGIN {incr = 200; i=1-incr; j=0}
    NR % incr == 1 {
        i += incr
        j += incr
        close(out)
        out = i "to" j ".txt"
    }
    {print > out}
' big_file.txt

큰 파일을 4000¼200=20번 처리하는 대신 한 번만 처리하면 되므로 이 방법이 더 빠릅니다.

답변2

닫다.

에서는 j=$j + 200산술 확장(예: )을 명시적으로 호출해야 합니다 j=$(( j + 200 )).

그리고 sed -n '$i,$j p' big_file.txt > $ito$j.txt1)에서는 에 대한 인수에 작은따옴표 대신 큰따옴표를 사용해야 합니다 sed. 그렇지 않으면 은 $문자 그대로 받아들여지고 변수는 확장되지 않기 때문입니다. 2) 유효한 변수 확장이므로 i주위 에 중괄호가 필요합니다 .$ito

$또한 산술 컨텍스트에서는 변수 이름 앞에 를 사용할 필요가 없습니다(아마도 사용해서는 안 됩니다) .

그래서 저는 이것을 다음과 같이 다시 작성하겠습니다.

j=0
for (( i = 1 ; i <= 3801 ; i = i + 200)); do
    j=$((j + 200))
    sed -n "$i,$j p" big_file.txt > "${i}to$j.txt"
done

다른 사람들이 댓글을 달았듯이, 아마도 더 좋은 방법이 있을 것입니다. 이제 분할한 각 조각에 대해 파일 전체를 한 번씩 살펴보기 때문입니다.

관련 정보