Linux'ta bir satırdaki sayıları artırmanın en iyi yolu [kapalı]


1

Arada zaman da olan çok sayıda giriş içeren bir satırım var.

 ('DEFAULT',17,NULL,'2014-07-14 10:30:00','Something','2014-07-14 06:30:00',1),('DEFAULT',26,NULL,'2014-07-14 12:00:00','Something2,'2014-07-14 11:00:00',1),...

Her seferinde birkaç saat artırmak istiyorum. 24 saat formatında. Mesela 10:30:00olur 15:30:00.

Bu iş için en iyi evrensel araç nedir? Ben açısından düşünüyorum:

  1. gibi sistem programları awk, sed.. & başka ne bilmiyorum

  2. vim

  3. bashveya python` gibi betik dilleri

Bunu yapmanın kurallı yolu ne olabilir?


Her ne ile rahat ederseniz edin :) Mesela ben perl beucase kullanırdım. Aşina oldum ve gerçekten çok güçlü regexp var
Dan

Yanıtlar:


0

Sadece netleştirmek için:

vimçoğu * nix sistemde bir sistem yardımcı programıdır (metin editörü). awk, sedVe bashsen ayrıştırmak ve metin değiştirmek için kullanabileceğiniz (bağlama göre, ya araçları) dillerdir.

Zamanını artırmak için neye ihtiyacın var ve ne sıklıkla arttırman gerekecek? Hangi araçları kullanmak isteyeceğinizi bu faktör. Her durumda, bu çok parçalı bir çabadır.

  1. İlk önce bir dizgenin içindeki kısmi dizeleri eşleştiriyorsunuz. Sen kullanabilirsiniz awk, sedya da grep -ebu alt dizeleri dışarı çekmek için, bir düzenli ifade ile,.

  2. Bu değerlere sahipseniz, onları tam sayılara dönüştürürsünüz (veya python gibi daha dolu bir dil kullanıyorsanız, bunları bir kütüphane kullanarak tarih-saat değerlerine çevirebilirsiniz). Bu değerleri değiştirmek için ihtiyacınız olan matematiği (ve varsa doğrulama) yapmanız gerekecektir.

  3. Son olarak, değiştirilen değerleri satıra ekler ve değiştirilen dosyayı kaydedersiniz.

Dürüst olmak gerekirse, bu sql, öyle görünüyor, bu nedenle bu araçları değiştirmek için o dilde yerleşik araçları kullanmak çok daha kolay olabilir .


1
Bunu söylüyorsun awkve sedtamamen farklı bir kategoride vimmi? Referanstan mı bahsediyorsun, yoksa bu sadece senin fikrin mi? Her iki durumda da aynı fikirde değilim; Var olmayan bir ayrımı işaret ettiğinizi düşünüyorum.  awkve sedyardımcı programlar; öyle vim.  awkve sedkomut dilleri var; yapar vim(ve ayrıca bash; ve kabukları normalde faydalı programlar olarak kabul edilmese de , kesinlikle programlardır).  awkve sedmetni analiz etmek ve değiştirmek için <strike> ayrıştırmak </strike> için kullanabileceğiniz programlardır; öyle vim.
G-Man

Araçları kullanarak sektördeki yıllardan alıntı yapıyorum. vimMicrosoft Word’ün bir dil olduğu gibi bir dildir. Anlamsallığı seninle tartışmakla ilgilenmiyorum. Sadece netleştim çünkü OP'yi tanımlamak için kullanılan dil bilmediğim bir öneride bulundu ve terimlerin tanımlanmasına yardımcı olmaya çalışıyordum.
cognoscente

0

Bu cevapta matematiksel ve eşleştirme işlemlerinin birbirine karışmasını sağlayan Perl, Python, Ruby, vb. Gibi bir betik dili kullanarak en az dirençli bir yol öneren bazı iyi ipuçları vardır .

İşte Perl ile hızlıca kesmek:

$ echo '2014-12-05 10:00:10, 1234, 2015-02-01 09:12:24' | perl -pe \
    's/(\d{4}-\d{2}-\d{2} )(\d{2})(:\d{2}:\d{2})/join("",$1,$2+3,$3)/eg'
2014-12-05 13:00:10, 1234, 2015-02-01 12:12:24
$

Bu basit örnekte, tarihin konumsal bileşenlerini yakalamak \diçin tekrar göstergesinin (örneğin) takip ettiği rakam karakter sınıfı ( ) {2}kullanılır ve saat alanında kör olarak aritmetik yapıyoruz. Bu tür bir çözüm, yalnızca saat alanındaki basit aritmetik işlemlerin günün kaymasına neden olmayacağından emin olmak için yeterince bilginiz olduğunda uygundur.

Saat alanının @Lieven tarafından istendiği gibi taşması durumunda, doğru tarih / saat aritmetiğine değinmek için bu sorunun tekrar ele alınmasıyla, Perl çekirdek modülü Time::Piece(Perl> 5.8) kullanılabilir:

$ echo '2014-12-05 22:00:00, 1234, 2015-02-01 09:12:24' | \
    perl -MTime::Piece -pe \
        's/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/( \
            Time::Piece->strptime($1, "%Y-%m-%d %T") \
            + (60*60*3))->strftime("%Y-%m-%d %T")/eg'
2014-12-06 01:00:00, 1234, 2015-02-01 12:12:24
$

Bu örnek girdi, ertesi güne taşınan saat değerlerinin zarif bir şekilde ele alındığını göstermek için güncellendi. Time::PieceModül komut satırından çeker , tarih / saat girişinden eşleşir, Time::Piecetarih / saat aritmetiği gerçekleştirmek için nesnelere dönüştürülür , ardından istenen çıktı formatına geri döndürülür.


Bir kişi regex kullanarak% 99 hak kazanabilir, ancak günü, ayı veya yılı artırmak zorunda kalmanın hesaba katmanın kolay bir yolu yoktur (ve artık yıllara dokunmuyor bile) .
Lieven Keersmaekers,

@Lieven_Keersmaekers: bu matematiği doğru şekilde yapmak için maç sonuçlarından tarih zaman nesneleri oluşturmak mantıklı görünüyor, ancak Perl ile ilk içgüdüm, amacımı daha net hale getirmek için kutu notasyonu ve daha ayrıntılı bir stil kullanarak bir senaryo yapmak olacaktır. Tek bir astar olarak, en iyi bahis, verilerinizi bilmek ve hangi dönüşümlerin istenen sonucu vereceğini belirlemektir.
Deaks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.