변수를 어떻게 쓰는지 모르겠어요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.txt
1) 인수에 작은따옴표 대신 큰따옴표를 사용해야 합니다 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
다른 사람들이 언급한 것처럼 아마도 더 좋은 방법이 있을 것입니다. 이제 분할의 각 부분에 대해 파일을 완전히 한 번 살펴볼 수 있기 때문입니다.