Скрипт оболочки: правильный формат переменных

Скрипт оболочки: правильный формат переменных

Я не знаю, как писать переменные сsed

Итак, я хочу выполнить следующую задачу, используя цикл for:

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

Я бы сделал это с помощью одной программы awk, вместо вызова sedНраз

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это будет допустимым расширением переменной.

Кроме того, в арифметических контекстах вам не нужно (и, вероятно, не следует) использовать the $перед именем переменной.

Итак, я бы переписал это так:

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

Как уже отмечали другие, вероятно, есть лучший способ сделать это, поскольку теперь вы проходите по файлу полностью один раз для каждой части, на которую вы делите.

Связанный контент