Eingang:
1
hgh
h2b
h4h
2
ok
koko
lkopk
3
uh
ju
nfjvn
4
Erwartete Ausgabe:
1
2
3
4
Ich muss also nur den 1., 5., 9., 13. Wert der Datei in der Ausgabedatei haben. Wie macht man das?
text-processing
Velu
quelle
quelle
sed -n '1~4p'
Antworten:
Verwenden von AWK:
Herauszufinden, wie dies funktioniert, bleibt dem Leser als Übung überlassen.
quelle
NR % 4 == 1
wäre besser lesbar IMO.Verwendung von
split
(GNU Coreutils):-n
CHUNKS
Ausgabedateien generierenund
CHUNKS
alsr/K/N
Verwenden Sie die Round-Robin-Verteilung und geben Sie nur Kth von N an stdout aus, ohne Zeilen / Datensätze zu teilenquelle
Mit GNU
sed
:Mit Standard
sed
:Mit
1
und4
in$n
und$i
Variablen:quelle
Hinzufügen der obligatorischen Perl-Lösung:
quelle
Python-Version, nur zum Spaß:
quelle
enumerate(f)
sollte in der Lage sein, die Arbeit zu erledigen, während weniger Speicher verbraucht wirdreadlines
möchten (wodurch die gesamte Datei in den Speicher geschlürft wird), könnenf.readlines()[::4]
Sie jede vierte Zeile abrufen. So können Sie verwendenprint(''.join(f.readlines()[::4]))
.POSIX sed
: Diese Methode verwendet das posixly sed und kann daher überall ausgeführt werden, oder zumindest die Samen, die posix respektieren.Eine andere ist eine programmatische Sed-Code-Generierung für Skalierbarkeitszwecke:
Perl
: Wir füllen Array A auf, bis es 4 groß ist. Dann drucken wir das erste Element und löschen das Array.quelle
Call with
scriptname filename skip
(4 in Ihrem Fall) Es funktioniert, indemiter
Zeilen vom Anfang der Datei gezogen und dann nur die letzten ausgegeben werden. Es erhöht danniter
durchskips
und wiederholt, solange der Wertiter
nicht überschritten hat daslines
infile
.quelle
Pure Bash:
mapfile ist eine in Bash 4 hinzugefügte integrierte Datei, die Standardeingaben in ein hier genanntes Array
lines
mit einer Zeile pro Eintrag liest . Die-t
Option entfernt die letzten Zeilenumbrüche.Wenn Sie jede vierte Zeile ab Zeile 4 drucken möchten, können Sie dies in einem Befehl mithilfe
mapfile
der Rückrufoption tun, bei-C
der der bereitgestellte Code alle paar Zeilen mit dem angegebenen Intervall ausgeführt wird-c
. Der aktuelle Array-Index und die nächste zuzuweisende Zeile werden dem Code als Argumente übergeben.Dies verwendet das
printf
eingebaute; Der Formatcode%.0s
unterdrückt das erste Argument (den Index), sodass nur die Zeile gedruckt wird.Sie könnten den gleichen Befehl verwenden, um jede vierte Zeile ab Zeile 1, 2 oder 3 zu drucken, aber Sie müssten 3, 2 oder 1 Zeilen voranstellen,
input
bevor Sie sie eingebenmapfile
, was meiner Meinung nach mehr Probleme als wert ist .Dies funktioniert auch:
Hier werden
printf
vier Einträge des Arrayslines
gleichzeitig verbraucht , wobei nur der erste gedruckt und die anderen drei mit übersprungen werden%.0s
. Ich mag das nicht, da Sie für verschiedene Intervalle oder Startpunkte manuell mit der Formatzeichenfolge herumspielen müssen.quelle