Shell-Skript: Korrektes Format für Variablen

Shell-Skript: Korrektes Format für Variablen

Ich weiß nicht, wie man Variablen schreibt mitsed

Ich möchte also die folgende Aufgabe mithilfe einer For-Schleife erledigen:

sed -n '1,200p' große_Datei.txt > 1bis200.txt
sed -n '201,400p' große_datei.txt > 201to400.txt
sed -n '401,600p' große_datei.txt > 401bis600.txt
sed -n '601,800p' große_datei.txt > 601bis800.txt
sed -n '801,1000p' große_datei.txt > 801bis1000.txt
sed -n '1001,1200p' große_datei.txt > 1001bis1200.txt
sed -n '1201,1400p' große_datei.txt > 1201bis1400.txt
sed -n '1401,1600p' große_datei.txt > 1401bis1600.txt
sed -n '1601,1800p' große_datei.txt > 1601bis1800.txt
sed -n '1801,2000p' große_datei.txt > 1801bis2000.txt
sed -n '2001,2200p' große_datei.txt > 2001bis2200.txt
sed -n '2201,2400p' große_Datei.txt > 2201bis2400.txt
sed -n '2401,2600p' große_datei.txt > 2401bis2600.txt
sed -n '2601,2800p' große_datei.txt > 2601bis2800.txt
sed -n '2801,3000p' große_datei.txt > 2801bis3000.txt
sed -n '3001,3200p' große_datei.txt > 3001bis3200.txt
sed -n '3201,3400p' große_Datei.txt > 3201bis3400.txt
sed -n '3401,3600p' große_datei.txt > 3401bis3600.txt
sed -n '3601,3800p' große_datei.txt > 3601bis3800.txt
sed -n '3801,4000p' große_datei.txt > 3801bis4000.txt

Was ich versucht habe:

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

Helfen Sie mir bitte dabei. Geben Sie mir bitte auch eine Erklärung.

Antwort1

Ich würde dies mit einem einzigen awk-Programm tun, anstatt sed aufzurufenNmal

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

Dies sollte schneller gehen, da Sie die große Datei nur einmal und nicht 4000÷200=20 Mal verarbeiten müssen.

Antwort2

Schließen.

In j=$j + 200müssen Sie die arithmetische Erweiterung explizit aufrufen, d. h. j=$(( j + 200 )).

Und in sed -n '$i,$j p' big_file.txt > $ito$j.txt1) müssen Sie im Argument für doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden sed, da sonst $wörtlich genommen wird und die Variablen nicht erweitert werden; 2) Sie benötigen Klammern um das i, da $itoeine gültige Variablenerweiterung wäre.

Außerdem müssen (und sollten) Sie in arithmetischen Kontexten das $vor dem Variablennamen nicht verwenden.

Ich würde es also folgendermaßen umschreiben:

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

Wie andere bereits kommentiert haben, gibt es hierfür vermutlich eine bessere Möglichkeit, da Sie die Datei jetzt für jedes Stück, in das Sie sie aufteilen, einmal vollständig durchlaufen.

verwandte Informationen