Ich möchte eine große Datei aufteilen und GZipen und diese Antwort schien das zu sein, wonach ich suchte, und es schien mir eine sehr nützliche Möglichkeit zu sein, Dinge zu tun, an die ich nie gedacht hatte, also möchte ich es verallgemeinern; Das einzige Problem ist: Es scheint nicht zu funktionieren.
Angenommen, ich möchte meine Eingabe aufteilen und weiterverarbeiten (ich weiß split
aber ich möchte es direkt in meinem Skript herumspielen!)
Dies nutzt read
eine Zeile in eine Variable einlesen
#!/bin/bash
printf " a \n b \n c \n d " |
for ((i = 0 ; i < 2 ; i++)) ; do
echo "<< $i >>"
for ((j = 0 ; j < 2 ; j++)) ; do
read l
echo "$l"
done
done
Es druckt
<< 0 >>
a
b
<< 1 >>
c
d
Was ist fast das, was ich will, abgesehen von der Tatsache, dass die Leerzeichen von Anfang bis Ende gekürzt werden (und die Zeile möglicherweise auf andere Weise geändert wird? Funktioniert es mit willkürlichem UTF-8-codiertem Inhalt?) bearbeiten gelöst
Und ich stelle mir vor, es könnte ziemlich langsam sein. bearbeiten Benchmarking: mindestens 3000x langsamer.
Also habe ich versucht, es durchzuleiten head
(Ich bekomme das Ergebnis mit awk
wie die Antwort schon sagt, scheint es nichts anders zu machen)
#!/bin/bash
printf " a \n b \n c \n d " |
for ((i = 0 ; i < 2 ; i++)) ; do
echo "<< $i >>"
head -n 2
done
Das druckt
<< 0 >>
a
b
<< 1 >>
Und hört da auf head
schließt offenbar seine Eingabe beim Beenden. Ich habe kein Programm gefunden, das dies nicht tut, und vielleicht wird es tatsächlich vom System durchgesetzt? (Ich bin auf OS X)
Verwenden head -n 2 <&0
was (laut den bash docs) den file descriptor zuerst kopiert, funktioniert auch nicht.
Muss ich eine Named Pipe verwenden? Gibt es eine Beschwörung, um diese Arbeit zu machen?
read
streift es ab, echo ".$l."
druckt .a.
. Ich denke, die Shell entfernt Leerzeichen beim Aufteilen der Argumente, l=" a "; echo $l
druckt a
aber l=" a "; echo "$l"
druckt die Leerzeichen `a`. ( read
kann auch die Eingabe auch durch Leerzeichen und mehrere Variablen füllen, deshalb wahrscheinlich)
read l
.
echo "..$l.."
um zu sehen, was in gespeichert wurde l , wie Echo ignoriert führende und nachfolgende Leerzeichen.