Ich möchte die ungeraden und geraden Zeilen aus Dateien drucken.
Ich habe dieses Shell-Skript gefunden, das Echo verwendet.
#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
file=$1
counter=0
eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name
if [ $# -eq 0 ]
then
echo "$(basename $0) file"
exit 1
fi
if [ ! -f $file ]
then
echo "$file not a file"
exit 2
fi
while read line
do
# find out odd or even line number
isEvenNo=$( expr $counter % 2 )
if [ $isEvenNo -ne 0 ]
then
# even match
echo $line >> $eout
else
# odd match
echo $line >> $oout
fi
# increase counter by 1
(( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"
Aber gibt es keine Möglichkeit, dies in einer Zeile zu tun?
Ja, benutze awk, ich lese.
Gerade Zeilen:
awk 'NR % 2' filename
ungeradzahlige Zeilen:
awk 'NR % 2 == 1' filename
Aber bei mir funktioniert es nicht. Beide erzeugen die gleiche Ausgabe, laut Diff. Im Vergleich zur Originaldatei sind beide tatsächlich halb so lang und enthalten die ungeradzahligen Zeilen. Mache ich etwas falsch?
text-processing
sed
awk
ixtmixilix
quelle
quelle
NR % 2 == 0
, sonst ist es gleichbedeutend mit dem zweiten.Antworten:
Wie Sie "in einer Zeile" gefragt haben:
Beachten Sie, dass der größte Teil des Codes auf Ihre ausgefallene Wahl des Ausgabedateinamens zurückzuführen ist. Andernfalls würde der folgende Code ausreichen, um ungerade Zeilen in "Zeile-1" und gerade Zeilen in "Zeile-0" einzufügen:
quelle
Ich bevorzuge es, wenn immer möglich, POSIX-kompatibel zu sein, daher dachte ich, ich würde diese alternative Methode veröffentlichen. Ich verwende diese oft, um Text vor
xargs
Pipelines zu entstellen .Geradzahlige Zeilen drucken,
Drucken von ungeraden Zeilen,
Obwohl ich es oft benutze
awk
, ist es für diese Art von Aufgabe übertrieben.quelle
Das ist einfach:
druckt geradzahlige Zeilen aus dem Dateinamen
druckt ungerade Zeilen.
quelle
awk
, ich persönlich benutze es sehr oft. Ich habe nie gesagt, dass irgendetwas mit "Nicht POSIX" zu tunawk
hat. Ich bezog mich auf diesed
Optionen der Antwort . Speziell für den~
Betreiber ist es eine GNU-Erweiterung, die für viele Menschen noch akzeptabel ist. Das "Verwenden von AWK, I personally believe using
außerhalb von awk" für diese einfache Aufgabe ist übertrieben. Die +1 war also für die Erfüllung der Aufgabe mitsed
einem leichteren Dienstprogramm alsawk
.Für gerade Zahlen sollte der Code sein
& für ungerade Zahlen
quelle
gawk 'FS=",";NF%2==0' file.csv
.Sie können dies mit einem einzigen
sed
Aufruf tun , ohne die Datei zweimal lesen zu müssen:oder, wenn Sie es vorziehen, in einer Zeile:
Beachten Sie, dass diese nicht das erwartete Ergebnis geben , wenn eine Datei nur eine Zeile enthält (die Linie wird
w
zu Ritteeven
stattodd
als erstenn
nicht ausgeführt wird ). Um dies zu vermeiden, fügen Sie eine Bedingung hinzu:Wie es funktioniert ? Nun, es werden drei
sed
Befehle verwendet:n
- Wenn nicht in der letzten Zeile der Musterbereich gedruckt wirdstdout
(der in die Datei umgeleitet wirdodd
), ersetzen Sie ihn durch die nächste Zeile (so dass jetzt eine gerade Zeile verarbeitet wird) und fahren Sie mit der Ausführung der verbleibenden Befehle fortw
- fügen Sie hinzu Zu speichernder Musterbereicheven
d
- Löschen Sie den aktuellen Musterbereich und starten Sie den Zyklus neu. Der Nebeneffekt ist, dasssed
der Musterbereich niemals automatisch gedruckt wird, da er niemals das Ende des Skripts erreichtMit anderen Worten
n
wird nur auf ungeraden Zeilen ausgeführt undw
undd
werden nur auf geraden Zeilen ausgeführt.sed
Es wird nie automatisch gedruckt, es sei denn, wie gesagt, die Eingabe besteht aus einer einzelnen Zeile.quelle
Versuche dies:
quelle
Ich würde mitgehen,
perl
weil ich magperl
:Verwendet die Tatsache, dass
-p
implizit gedruckt wird, um zu replizieren, wie essed
funktioniert - und wir verwendenselect
sie, um zu wählen, in welches Dateihandle geschrieben wird.quelle