2016-06-03 13 views
0

Unter Eingabe hat zwei Datensatztypen - seine Datei mit fester Breite mit Zeilen werden durch Zeilenumbruch getrennt. Im Folgenden finden Sie die Beispieldatensätze.mehrere awks und if-Anweisung

Satzart -41: Satzlänge-629

Satzart -42: Satzlänge-557

Satzart 41 und 42 ähnlich sind nur 3 Felder fehlen. also Felder, die fehlen, füge ich es als Leerzeichen hinzu. Danach werde ich die Hive-Tabelle mit TBLPROPERTIES ('serialization.null.format' -> spaces erstellen, so dass Leerzeichen in der Hive-Tabelle als NULL-Werte behandelt werden. (sugget, ob es einen besseren Weg gibt, dies zu handhaben)

in der Satzart 42, aus der 88. Spalte bis 113 hinzugefügt 26 Räume, von 114 bis 139 Säule hinzugefügt 26 Räume und 165. Spalte hinzugefügt 20 Räume. die Aufzeichnungslänge 629.

i den Datensatztyp zu machen versuche zu machen 42 ist die Länge des Datensatzes wie 557 Leerzeichen hinzufügen, so dass die Datensatzlänge als 629 entspricht Datensatz 41. So dass ich diese Datei in einzelne Hive-Tabelle laden kann. Unten ist der Befehl, den ich benutze Fehler. Können wir diesen Befehl zu verbessern der Aufnahmetyp von 42 Länge mit Aufnahmetyp 41. Dies ist eine Datei fester Länge

while read line 
do 
awk ' 
      $2 == "1" { 
      echo $line >> test_pre.dat 
      echo "record type: 41"; 
      } 
      $2 == "2" { 
      awk 'BEGIN{FS=OFS=""} {$88="       "$88} 1 \ 
          {$114="       "$114} 1 \ 
          {$116="     "$116} 1' test.dat >> test_pre.dat 
      echo "record type: 42"; 
     }' 
done 

INPUT:

41310410768228735 354447062622381 0012167121812 110012167121812 110017402445978 06CCF005 61stas-att1.fsabcgroup0-010.ch1il01cvt.ch1il.uvp.els-an.abc.com 60000530400000002998F100F11000000000000000000000000150110192928150110192941150110192949000000080FFFFFFF00000000000000001B702A7C 0000000000000000 FFFFFFFF00 abc:[email protected];user=phone abc:[email protected];user=phone 000100

42310410755337373 354447061570839 0013133038111 110013133201177 06CCF005 61stas-att1.fsabcgroup0-005.ch1il01cvt.ch1il.uvp.els-an.abc.com 600004C150000000ADE5C100F11000000000000000100000000150110192815150110192822150110192950000000580000000000000000000000001B702BC9 0000000000000000 FFFFFFFF00 abc:+13133201177;[email protected]:+13133038111;npdi 000100

OUTPUT:

41310410768228735 354447062622381 0012167121812 110012167121812 110017402445978 06CCF005 61stas-att1.fsabcgroup0-010.ch1il01cvt.ch1il.uvp.els-an.abc.com 60000530400000002998F100F11000000000000000000000000150110192928150110192941150110192949000000080FFFFFFF00000000000000001B702A7C 0000000000000000 FFFFFFFF00 abc:[email protected];user=phone abc:[email protected];user=phone 000100

42310410755337373 354447061570839 0013133038111 110013133201177 0 6CCF005 61stas-att1.fsabcgroup0-005.ch1il01cvt.ch1il.uvp.els-an.abc.com 600004C150000000ADE5C100F11000000000000000100000000150110192815150110192822150110192950000000580000000000000000000000001B702BC9 0000000000000000 FFFFFFFF00 abc:+13133201177;[email protected]:+13133038111;npdi 000100

+2

Für mehrere Zeilen Code verwendet, nicht verwenden Backticks. Setzen Sie einfach 4 Stellen vor jede Zeile (markieren Sie den Code und verwenden Sie die Schaltfläche <> oben. Sind Ihre Input/Output 3 Datensätze oder ist es multiple? Wenn ich Ihre Quelle für diese Frage betrachten, ist Input/Output 3 Zeilen und so verpackt, dass sie wie viele aussehen: – JNevill

+0

Eingabe/Ausgabe hat Beispiel Datensatz einen Datensatz –

+0

Wie werden 2 Datensätze (Typ 41 und 42) in der Eingabedatei gespeichert? Werden sie nur durch ein Leerzeichen getrennt? Ist es auch okay, wenn irgendwo im Datensatztyp 42 Platz hinzugefügt wird, so dass seine Länge der Länge des Datensatztyps 41 entspricht? – sameerkn

Antwort

1
  1. a shell while Schleife erfordert die do und done keywords
  2. in awk $2 der Wert des zweiten Feldes , nicht das 2. Zeichen ist.
  3. Sie haben Shell-Befehle und Shell-Variablen in Ihrem awk-Skript.

Grundsätzlich ein Durcheinander. Versuchen Sie, diese

awk ' 
    /^.1/ { 
     print > "test_pre.dat" 
     print NR ": record type: 41" 
    } 
    /^.2/ { 
     printf("%s%-143s%s\n", substr($0, 1,114), "0", substr($0,114)) > "test_pre.dat" 
     print NR ": record type: 42" 
    } 
' test.dat 

Nicht die Ausgabedatei zu: pass im Dateinamen als awk Variable -v

awk -v output_file="$outfile" ' 
    /^.1/ { 
     print > output_file 
... 
' "$infile" 
+0

Danke Glenn :), es funktioniert. Ich habe die Vorlage, so kann ich dies gemäß meiner Anforderung ändern. –

+0

Hallo Glenn, anstelle von Hard-Codierung Dateinamen (wie -test_pre.dat) in der awk-Befehl gibt es eine Möglichkeit, Shell-Variablen zu verwenden? wenn ich das gleiche Skript für mehrere Dateien ausführen möchte. –