2016-11-07 3 views
2

Ich habe zwei Dateien. Die Ausgabedatei Ich suche hat Erdbeben Standorte und hat folgendes Format:Verwenden Sie einen Teil einer Spalte in einer Datei als Suchbegriff in einer anderen Datei

19090212 1323 30.12 36 19.41 103 28.24 7.29 0.00 4 149 25.8 0.02 5.7 9.8 D -   0 
19090216 1828 49.61 36 13.27 101 35.38 10.94 0.00 13 54 38.5 0.07 0.3 0.7 B   0 
19090711 2114 54.11 35 1.07 99 56.42 7.00 0.00 7 177 18.7 4.00 63.3 53.2 D #   0 

ich die letzten 6 Ziffern der ersten Spalte verwendet werden soll (dh ‚090.418‘ aus ‚19090418‘) mit den ersten 3 Ziffern der zweiten Spalte (dh '072' von '0728') als mein Suchbegriff. Die Datei, die ich gesucht habe, hat folgendes Format:

SC17 P 090212132329.89 
X25A P 090212132330.50 

AMTX P 090216182814.12 
X29A P 090216182813.70 
Y28A P 090216182822.36 
MSTX P 090216182826.80 
Y27A P 090216182831.43 

Nachdem ich die zweite Datei für den Begriff zu suchen, muß ich, wie viele Zeilen in diesem Abschnitt ist, um herauszufinden. Wenn ich also in diesem Beispiel nach den Begriffen der zweiten Datei suchte, möchte ich wissen, dass es 2 Zeilen für 090212132 und 5 Zeilen für 090216182 gibt.

Dies ist mein erster Beitrag, also lassen Sie es mich bitte wissen Ich kann Klarheit oder Prägnanz in meinen Beiträgen verbessern. Danke für die Hilfe!

+0

was haben Sie bisher versucht? –

+2

Und was ist das erwartete Ergebnis? – anubhava

+0

Ihre erste Datei enthält keine Teile aus der zweiten Datei. Bitte beheben Sie Ihr Beispiel. Im Moment gibt es keine Ausgabe: 'grep -f <(cut -b 3-8,10-12 file1) file2' – Cyrus

Antwort

1

awk zur Rettung!

$ awk 'NR==FNR{a[substr($1,3) substr($2,1,3)]; next} 
       {k=substr($3,1,9)} 
     k in a{a[k]++} 
      END{for(k in a) if(a[k]>0) print k,a[k]}' file1 file2 

Mit Ihren Eingabedateien gibt es keine Ausgabe wie erwartet.

+0

einige Kommentare hier zu erklären, was getan wird, wird helfen .. –

+0

Ich verstehe ein Stück davon ... wie liest die Datei und speichern Sie den Inhalt in Array a ... extrahieren Sie die zweite Datei $ 3 in k ... was ist 'k in a {a [k] ++}' .. –

0

Die Antwort Karakfa vorgeschlagen funktioniert! Meine Ausgabe sieht wie folgt aus:

100224194 7 
100117172 18 
091004005 11 
090520220 10 
090526143 21 
090122033 20 

Danke für die Hilfe!

+0

möchten Sie vielleicht Karafka Antwort in diesem Fall akzeptieren .. –

+0

Vielen Dank! Erledigt. @JayRajput –

0

Karafka Antwort mit Erklärung

awk 'NR==FNR {    # For first file 
    $1 = substr($1, 3);  # Get last 6 characters from first col 
    $2 = substr($2, 1, 3); # Get first 3 characters from second col 
    a[$1 $2];    # Add to an array 
    next }     # Move to next record in first file 

          # Start processing second file 
    {k = substr($3, 1, 9)} # Get first 9 character for third col 
    k in a {a[k]++}   # If key in a, then increment the key 

    END { 
     for (k in a)   # Iterate array 
     if (a[k] > 0)  # If pattern was matched 
      print k, a[k]  # print the pattern and num occurrence 
    }' 
Verwandte Themen