Bir metin dosyasındaki belirli bir alanı nasıl sıfırlayabilirim?


3

Böyle bir dosyam var:

123123213,456,be
124243233,4346,ytr
123123123,436535,uytr
324234324,322,yt
234324323,32,tyutr

Sonuç vermek için orta alanı sıfırlamak istiyorum:

123123213,00000456,be
124243233,00004346,ytr
123123123,00436535,uytr
324234324,00000322,yt
234324323,00000032,tyutr

Bunu yapacak bir senaryoyu nasıl yapabilirim?

Bunun gibi bir örnek gördüm

awk '{ $6=sprintf("%06s", $6); print $0}'

ama ben gerçekten anlamıyorum ve bu yüzden çalışamıyorum.

Yanıtlar:


7

Bunu dene:

awk -F , '{ printf "%i,%08i,%s\n" , $1 , $2 , $3 }' file

yapacağım, teşekkürler, bunun nasıl çalıştığını açıklayabilir misiniz?
mattm123

2
Tamam, -F , anlatır awk kullanmak , alan ayırıcı olarak üç alanı da yazdırır ( $1, $2 ve $3 ) özel bir biçimde: "%i,%08i,%s\n", %i tamsayılar için %08i alan genişliğini sıfırlarla 8 sola doldurma %s dizeleri için. Daha fazla bilgi için man printf veya İşte . Umarım bu size yardımcı olur.
cYrus

virgül ayırıcısını $ '\ xE7' girişini kullanarak bir cedilla olarak değiştirmem gerekiyor ama "% i" $ '\ xE7' "% 08i \ n", $ 1, $ 2 baskılarını kullandığımda doğru çıkmıyor. herhangi bir fikir?
mattm123

Gibi bir şey: awk -F , '{ printf "%i\xe7%08i\xe7%s\n" , $1 , $2 , $3 }' file?
cYrus

1

Sorunu etiketlediğinden beri [sed], burada bir sed betiğe dayalı sürüm İşte .

sed 's/[^,][^,]*/\n0000000&/2;s/\n[^,]*\(.\{8\}\),/\1,/' inputfile

Açıklama:

  • bir alan bir veya daha fazla virgül olmayan gruptan oluşur: [^,][^,]* (bu aynı zamanda [^,]\+ )
  • ikinci alanın yerine (eşleşme) ( s///2 ) yeni bir satır, bir grup sıfır ve maçın içeriği: \n0000000& (newline, bir sonraki adım için alanın başlangıcını işaretlemek için kullanılır)
  • şimdi yeni satırla eşleş, sıfır veya daha fazla virgül olmayan ve tam olarak sekiz \{8\} Herhangi bir karakterin (bu karakterleri yakalama) \(\) ) ardından virgül
  • yakalanan karakterlerin yerine \1 maç için, bu geçici yeni çizgiyi ve aşırı sıfırları kaldırır

Bunun işleyiş şekli, alanın başına fazla sıfır eklemek ve sonra hepsini kesmektir.


0

Sorunuzdaki komut doğru, sadece biraz güncellemeye ihtiyacınız var.

awk '{ $6=sprintf("%0.8s", $6); print $0}'

ayrıca çıkış alanı ayırıcı kullanımını değiştirmek için:

awk '{ OFS="\xE7"; $6=sprintf("%0.8s", $6); print $0}'

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.