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

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

변수를 어떻게 쓰는지 모르겠어요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 프로그램을 사용하여 이 작업을 수행합니다.질소이류

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

$또한 산술적 맥락에서는 변수 이름 앞에 use를 사용할 필요가 없으며 아마도 그렇게 해서도 안 됩니다 .

그래서 나는 그것을 다음과 같이 다시 썼습니다:

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

다른 사람들이 언급한 것처럼 아마도 더 좋은 방법이 있을 것입니다. 이제 분할의 각 부분에 대해 파일을 완전히 한 번 살펴볼 수 있기 때문입니다.

관련 정보