
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 + 200
müssen Sie die arithmetische Erweiterung explizit aufrufen, d. h. j=$(( j + 200 ))
.
Und in sed -n '$i,$j p' big_file.txt > $ito$j.txt
1) 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 $ito
eine 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.