2017-05-08 4 views
2

Ich habe eine Datei A.txt und eine Datei B.txt. Die B.txt-Datei enthält eine Liste von Zeichenfolgen (eine pro Zeile), die am Ende jeder 4. Zeile in der A.txt-Datei eingefügt werden müssen.Hinzufügen von Strings in einer Textdatei am Ende jeder 4. Zeile

Beispiel:

A.txt (I die Zeilennummer für dieses Beispiel hinzugefügt - in realen Fällen gibt es keine solche Spalte):

1 id_line1 
2 some text 
3 some text 
4 some text 
5 id_line2 
6 some text 
7 some text 
8 some text 
9 id_line3 
10 some text 
11 some text 
12 some text 
13 id_line4 
14 some text 
15 some text 
16 some text 

B.txt

1 A 
2 B 
3 C 
4 D 

So enthält B.txt genau 4 mal weniger Zeilen als A.txt Zeilen (jede B.txt Zeile entspricht der 4. Zeile in A.txt).

Und am Ende würde ich eine C.txt Datei wie zum Beispiel:

id_line1_A 
some text 
some text 
some text 
id_line2_B 
some text 
some text 
some text 
id_line3_C 
some text 
some text 
some text 
id_line4_D 
some text 
some text 
some text 

Mein Problem in einer Schleife durch die Datei sed/awk mit B.txt ist. Trotzdem könnte ich es auch in höheren Sprachen (z. B. python) tun.

Irgendwelche Idee? Dank

Antwort

2

Hier ist ein Weg, um es mit sed zu tun, sondern auch paste, xargs und printf verwendet, die ziemlich Standard sind:

sed 's:$:\n\n\n:' B.txt | 
    paste -d'\n' A.txt - | 
    xargs -n8 -d'\n' printf '%s_%s\n%s%s\n%s%s\n%s%s\n' 

Grob: (1) macht die Dateien die gleiche Länge, (2) füge die Zeilen einzeln zusammen, (3) drucke in dem von dir gewünschten Format.

+0

Danke das ist perfekt. Der erste sed Trick ist eine sehr gute Idee! –

0

In Python3, dies den Trick tun würde:

with open('a.txt') as a_file: 
    with open('b.txt') as b_file: 
     for b_line in b_file: 
      print(next(a_file).strip()+'_', end='') 
      print(b_line, end='') 
      for _ in range(3): 
       print(next(a_file), end='') 

Mit Ihren Beispielen gibt sie:

1 id_line1_1 A 
2 some text 
3 some text 
4 some text 
5 id_line2_2 B 
6 some text 
7 some text 
8 some text 
9 id_line3_3 C 
10 some text 
11 some text 
12 some text 
13 id_line4_4 D 
14 some text 
15 some text 
16 some text 
0
awk 'FNR==NR{B[NR-1]=$0;next}{if(!((FNR+3)%4))$0=$0 B[(b++ %4)]}4' FileB.txt FileA.txt 

mit dem Kommentar innen

awk ' 
    # loading file B in memory, and read next line (until next file) 
    FNR==NR { B[NR - 1]=$0;next} 

    # complete file a 
    { 
    # 4th line (from 1st) 
    # using the modulo of line numer (%) and a incremented counter (b) 
    if(! ((FNR + 3) % 4)) $0 = $0 B[(b++ % 4)] 
    # print every line 
    print 
    } 

    # file order is mandatory 
    ' FileB.txt FileA.txt 
1

Dies könnte arbeite für dich (GNU sed):

Fügen Sie eine Zeile fileB zu jeder vierten Zeile von DateiA hinzu und leiten Sie die resultierende Datei in einen zweiten Aufruf von sed, der den angehängten Zeilenumbruch durch einen Unterstrich ersetzt.

Verwandte Themen