2017-02-07 5 views
1

Mein Problem ist folgendes: Ich habe eine Textdatei, wo keine leeren Zeilen sind, jetzt möchte ich die Zeilen gemäß der Musterdatei, wo 1 bedeutet, drucken Sie die Zeile ohne ein neue Zeile, 0 - enthält eine neue Zeile. Meine Textdatei ist:Einschließlich leere Zeilen mit Muster

apple 
banana 
orange 
milk 
bread 

Thу Musterdatei ist:

1 
1 
0 
1 
0 
1 
1 

Der Wunsch Ausgang entsprechend:

apple 
banana 

orange 

milk 
bread 

Was ich versucht ist:

for i in $(cat pattern file); 
do 
    awk -v var=$i '{if var==1 {print $0} else {printf "\n" }}' file; 
done. 

Aber es druckt alle Zeilen zuerst, und erst danach ändert es $i

Danke für alle Aufforderungen.

+0

Es gibt nichts in der 'awk' Befehl, der macht es wählt eine bestimmte Zeile der Datei aus. – Barmar

+0

@H_squared Er benutzt '$ i' in' bash', nicht in 'awk'. – Barmar

+0

Wie bist du jemals in einer Situation gelandet, in der du diese Eingaben hast? Scheint so, als würdest du den Fahnenmast bellen. – tripleee

Antwort

1

erlauben mehrere 0 zwischen 1

Selbst Code dokumentiert

awk '# for file 1 only 
    NR==FNR { 
     #load an array with 0 and 1 (reversed due to default value of an non existing element = 0) 
     n[NR]=!$1 
     # cycle to next line (don't go furthier in the script for this line) 
     next 
     } 
    # at each line (of file 2 due to next of last bloc) 
    { 
     # loop while (next due to a++) element of array = 1 
     for(a++;n[a]==1;a++){ 
      # print an empty line 
      printf("\n") 
      } 
     # print the original line 
     print 
    }' pattern YourFile 
  • Notwendigkeit der Umkehrung der Wert unendlich neue Linie am letzten zu vermeiden Zeile für den Fall, dass weniger Informationen im Muster vorhanden sind als Zeile in der Datendatei
  • mehrere 0 brauchen eine Schleife + Test
  • unsynchro zwischen Aktenzeichen Muster und Datendatei ist ein Problem, eine direkte Array (es sei denn, es halten, wie viel Newline einzufügen, einen anderen Weg, es zu tun)
+0

NeronLeVelu, danke für Ihre Antwort! Wenn möglich, könnten Sie bitte die Bedeutung des Ausdrucks 'n [NR] =! $ 1' erklären und warum brauchen wir zwei 'a ++' in einer Schleife? – MirrG

+0

hat den Kommentar im Code direkt hinzugefügt, es lädt die Musterdatei in einem Array für einen Leser verwenden beim Lesen von Textdatei – NeronLeVelu

+0

NeronLeVelu, danke für Ihre Kommentare! – MirrG

2

Lesen Sie die Musterdatei in ein Array und verwenden Sie dieses Array dann beim Verarbeiten der Textdatei.

awk 'NR==FNR { newlines[NR] = $0; next} 
    { print $0 (newlines[FNR] ? "" : "\n") }' patternfile textfile 
+1

Ich habe vergessen, den normalen Zeilenumbruch hinzuzufügen, behoben. – Barmar

+0

Ja, ich habe versucht, die Syntax der vorherigen Antwort zu verstehen, aber ich habe es nicht geschafft. Jetzt ist es klarer für mich. Vielen Dank! – MirrG

1

Dies ist ein bisschen wie ein Hack, aber ich präsentiere es als Alternative zu Ihrem traditionell awk-y-Lösungen:

paste -d, file.txt <(cat pattern | tr '\n' ' ' | sed 's,1 0,10,g' | tr ' ' '\n' | tr -d '1') | tr '0' '\n' | tr -d ',' 

Die Ausgabe sieht wie folgt aus:

apple 
banana 

orange 

milk 
bread 
1

Inverse von Barmar's, lesen Sie den Text in ein Array und drucken Sie dann, während Sie das Muster verarbeiten:

$ awk 'NR==FNR {fruit[NR]=$0; next} {print $0?fruit[++i]:""}' fruit.txt pattern.txt 
apple 
banana 

orange 

milk 
+0

Jas, danke für deine Lösung! Wenn ich fragen darf, könntest du bitte die zweite Klammer erklären: {print $ 0? Fruit [++ i]: ""}, weil ich es nicht geschafft habe, einen solchen Ausdruck in awk UserGuide zu finden. – MirrG

+1

@MirrG es druckt die nächste Zeile aus Frucht-Array (Kopie von Textdatei Inhalt) wenn Muster = 1, wenn es nicht eine leere Zeile drucken. Wenn es die Frucht druckt, erhöht es auch den Index für das Erreichen der nächsten Frucht im Feld (für nächste Zeile) – NeronLeVelu

1

Für eine Antwort nur bash mit:

i=0; mapfile file < file 
for p in $(<pattern); do 
    ((p)) && printf "%s" "${file[i++]}" || echo 
done 
Verwandte Themen