2017-09-07 3 views
1

Ich habe mehrere CSV-Dateien wie folgt:Awk zum Formatieren von CSV-Dateien | Unix | Solaris | awk

~/Prod/Jcs/BIN/Dash_PPLP/load$ ls -lt *csv 
-rw-rw-r-- 1 tellus tellus  81 Sep 7 14:27 extraction_MBBSCS_PPL_USAGE_IMPORT.csv 
-rw-rw-r-- 1 tellus tellus  83 Sep 7 14:27 extraction_MBBSCS_PPL_INVOICE_IMPORT.csv 
-rw-rw-r-- 1 tellus tellus  71 Sep 7 14:27 extraction_INVOICE.csv 
-rw-rw-r-- 1 tellus tellus  69 Sep 7 14:27 extraction_USGRERUN.csv 
-rw-rw-r-- 1 tellus tellus  69 Sep 7 14:27 extraction_USG.csv 
-rw-rw-r-- 1 tellus tellus  72 Sep 7 14:27 extraction_LIA.csv 
-rw-rw-r-- 1 tellus tellus  74 Sep 7 14:27 extraction_MSISDN.csv 

Durch eine Datei

cat extraction_LIA.csv 
PPL_LIABILITY,2468705,Fri Sep 01 06:56:41 2017,Fri Sep 01 06:58:33 2017 

Das Format Öffnen ist der Name, Zeilen START_TIME und end_time für jeden Fluss I überwachen möchten, um mache sie zu einer ORACLE-Tabelle "ladbar".

ich ein Skript wie das gemacht haben, die zu transformieren und überschreiben sie jeden, wie unten zu tun:

cat transform_to_load.bash 
#!/bin/bash 
csv_files=$(ls *.csv) 
for i in $csv_files 
do 
x=$(nawk 'BEGIN { OFS=","; FS=","} {split($3,a," ");split($3,b," ")} 
{$3=a[3]"/"a[2]"/"a[5]" "a[4];$4=b[3]"/"b[2]"/"b[5]" "b[4]} 
{print}' $i) 
echo $x > $i 
done 

Das Problem ist mit meinem nawk:

x=$(nawk 'BEGIN { OFS=","; FS=","} {split($3,a," ");split($3,b," ")} 
    {$3=a[3]"/"a[2]"/"a[5]" "a[4];$4=b[3]"/"b[2]"/"b[5]" "b[4]} 
    {print}' $i) 

, die die unten erzeugt (Startzeit ist die gleiche wie Endzeit)

Was ich erreichen möchte, ist es entsprechend zu formatieren w ith nawk (SunOS), wie dies für jeden einzelnen:

PPL_LIABILITY,2468705,01/Sep/2017 06:56:41,01/Sep/2017 06:58:33 

Könnten Sie mir bitte mit meinem nawk zur Ausgabe das richtige Format helfen?

Vielen Dank!

Antwort

2

Sie sind fast in der Nähe Ihrer Ziel, brauchen wenig zu korrigieren

Ursache:

Sein, weil in Ihrem Code, den Sie haben,

{split($3,a," "); split($3,b," ")} 
         ^
        So you get same result in end time 

Correct es wie unter

Lösung:

{split($3,a," "); split($4,b," ")} 
         ^
         Fourth Column will be used 

Inzwischen, wenn Sie interessiert sind, können Sie wie unten vereinfachen,

Keine Notwendigkeit der

  • csv_files=$(ls *.csv)
  • x=$(nawk '{..}')
  • echo $x > $i

Vereinfachte Version

$ cat test.sh 
#!usr/bin/env bash 

for i in *.csv; do 

# Better Prefer 
# /usr/xpg4/bin/awk or /usr/xpg6/bin/awk 

    nawk ' 
      BEGIN{ 
       FS=OFS="," 
      } 
      function format_dt(v, a){ 
       split($v,a,/ /); 
       $v=a[3]"/"a[2]"/"a[5]" "a[4] 
      } 
      { 
       format_dt(3); 
       format_dt(4) 
      }1 
     ' "$i" >tmpfile && mv tmpfile "$i" 
done 
+0

Hey! Vielen Dank, also Anpassung an $ 4 wird es beheben, richtig? –

+0

@tln_jupiter: ja wie du sehen kannst $ 3' bedeutet 3. Feld/Spalte –

+1

Sie sind wirklich hilfreich vielen Dank:) –