Shell-Script

Shell 腳本:變數格式正確

  • June 1, 2018

我不知道如何寫變數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

請幫助我這樣做。也請提供解釋。

關閉。

j=$j + 200中,您需要顯式呼叫算術擴展,即j=$(( j + 200 ))

sed -n '$i,$j p' big_file.txt > $ito$j.txt, 1) 中,您需要在 to 的參數中使用雙引號而不是單引號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

就像其他人評論的那樣,可能有更好的方法來做到這一點,因為現在您對分割的每一部分都完整地遍歷文件一次。

我會用一個 awk 程序來做到這一點,而不是呼叫 sed 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 次。

引用自:https://unix.stackexchange.com/questions/447344