2016-04-11 20 views
1

.csv biçiminde oluşturulan bazı verileri otomatikleştiriyorum ve veri değerleriyle alanları biçimlendirirken geliyorum. Lütfen bana yardım et. Böyle bir şey, ben awk kullanarak denedimUnix'teki her satırın veri formatı nasıl değiştirilir?

2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 

:

April 3 2016 FL 03112017 0 
April 4 2016 CA 04022016 0 
April 5 2016 TX 04302016 0 
April 6 2016 OH 05292016 0 
April 7 2016 AZ 06092016 0 
April 8 2016 MA 06252016 0 

ben aşağıdaki gibi dosya oluşturmak istiyorum:

Ben bir .csv dosyasına aşağıdaki verileri var :

awk -F "\t" '{print "date -d "$1" +'%Y-%m-%d'",$2,$3}' file.csv > file1.txt 

Bu işe yaramıyor. Yazdırılması gereken $ 1'e sonuç/hesaplanmış bir değer atayamıyorum. Sadece metin karıştırma, gerekli

+0

Olası yinelenen (http://stackoverflow.com/questions/2121896/converting-dates-in-awk) – bufh

+0

Hayır, ondan bir dup değil yıl. Ayrıca, bu soruya verilen cevap büyük değildir çünkü ilk komutta gereksiz yere bir alt kabuk ortaya çıkar ve dosyada her satır için bir satır aracı çağırır. Metnin her satırda karıştırılması ve 2. cevapta 'getline' yanlış kullanılır (başarısızlık için test/koruma yok). –

cevap

2

Tarih yok işlevleri: kesinlikle gerekli değil: İşte

$ awk ' 
    BEGIN{m="JanFebMarAprMayJunJulAugSepOctNovDec"} 
    {printf "%04d-%02d-%02d %s %s %s\n",$3,(match(m,substr($1,1,3))+2)/3,$2,$4,$5,$6} 
    ' file 
2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 
+1

Teşekkürler @Ed Morton. Bu çalışıyor. 'Awk' komutunda tarih formatlamasını (bahsettiğim kodda olduğu gibi kullanarak) kullanabilir miyim? Bu, yapmam gereken diğer işlemlerde bana yardımcı olur. – Jonathan

+0

Rica ederim. Evet, ancak eğer GNU awk'ınız varsa, o zamandan beri [gawk'un kendi zaman fonksiyonlarına sahip] olmanız gerekmez (http://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions) . GNU tarihini kullandığınız için, '-d' seçeneğinin kullanılması ile yargılanmanız gerekir. –

+0

Hey, bu kod yararlıdır, ancak bunu kullanırken sınırlayıcıyla bazı zorluklar yaşıyorum. Giriş dosyası sekmeyle ayrılmış ve çıktı dosyasının da sekmeyle ayrılmış olması gerekiyor. Sekme ile ayrılmış bir dosya oluşturmak için kodun farklı varyasyonlarını denedim, ancak yapamıyorum. Bu konuda bana yardımcı olabilir misiniz? – Jonathan

1

, ben ay adları oluşturmak için date kullanıyorum. Bu örnek girişi içerdiğinden [AWK tarihleri ​​dönüştürme] arasında

awk -v monthNames="$(for m in $(seq 1 12); do date -d "$m/1" +%B; done | paste -sd,)" ' 
    BEGIN { 
     split(monthNames, mn, ",") 
     for (i=1; i<=12; i++) m[mn[i]] = i 
     delete mn 
     FS = OFS = "\t" 
    } 
    { 
     split($1, d, " ") 
     $1 = sprintf("%d-%02d-%02d", d[3], m[d[1]], d[2]) 
     print 
    } 
' file.csv 
İlgili konular