2013-09-22 28 views
7

kullanarak # içermeyen satırları ayıklamak ve çıktıda ", ;'u silmek istiyorum.Awk: Bir dizgiye karşılık gelen eşlemeyi kullanarak ve ardından karakterleri

My giriş DOSYA şöyle görünür: Ben awk kullanmak istediğiniz Ancak

grep -v '#' FILE | tr -d ';"' 
string3 

:

# ;string"1" 
# string"2"; 
string"3"; 

istediği çıkışı elde etmek grep ve tr kullanabilir.

Ben invert maçı awk '!/#/' FILE çıkarabilir ama nasıl aynı awk komuta ", ; silmek için sub kullanabilir? hepsi sadece biri değil maçları yerini alacak

cevap

5

Sen küresel ikamesi için gsub kullanabilirsiniz baskı yapar içeren satırları atlamak yapar senin grep/tr boru hattı ile aynı sonuçları:

pax> echo '# ;string"1" 
# string"2"; 
string"3";' | awk '!/#/{gsub(/[";]/,"",$0);print}{}' 

string3 

Son bazı awk uygulamalarında gerekli olmayabilir, ancak bu kuralların hiçbiriyle eşleşen satırlar için otomatik olarak yapan bu uygulamalarda (genellikle daha eski olan) eşleşmeyen satırların çıktısını durdurmak gerekir.

+0

+1. Varsayılan olarak, gsub() 'da' $ 0' argümanına ihtiyacınız yok. –

3

Kullanım gsub yerine:

awk '/#/{next}{gsub(/[";]/,"")}1' file 

Çıktı:

string3 
  • gsub üçüncü parametre atlanıyor varsayılan olarak $0 işlemek yapar. o teslim,

    awk '!/#/{gsub(/[";]/,"",$0);print}' 
    

    aşağıdaki transkript eylem bunu gösterir:

  • /#/{next}
  • o
  • 1# o $0
+0

, sana ihtiyacım yok 'next'. Mesajımı gör "Başka bir awk versiyonu". Neden Sahip '' '[";] içinde?. 'Bunu değiştirmek için istek değildi, bu yüzden kaldırılabilir – Jotne

+1

@Jotne karmaşıklığı hala olurdu aynı ve hatta daha karmaşık senden beri' d genel ayırıcıyı genel olarak değiştirir ve hatta OFS = 'işlevini kullanır.Ayrıca, artık gerekli olmayan satırı işleyeceğinden, yorumlanmış bir satır hariç tutmadan önce gsub kullanarak daha fazla işleme sahip olacaksınız. Ve aslında bunu yapmadım nedeni. Bu arada teşekkürler. Güncellemeyi yaptım. – konsolebox

+0

+1, pozitif mantığa geçiş için ('' 'içermeyen satırları yerine' 'içeren satırları atla), böylece betiği gelecekte daha da artırılırsa, çift negatiflere maruz kalmayı daha az olası kılar. Muhtemelen bunun için fazlasıyla fazla ama genel olarak olumlu şeyler yapmaya çalışan genel kavram genellikle iyidir. OP, '' 'İÇERİDİR satırları' ',' '' 'ile başlayan satırları değil,'^'yi kaldırabildiğini söyledi. –

2

Başka awk versiyonu

awk -F"[\";]" '{$1=$1} !/^#/' OFS= file 
string3 

awk '{gsub(/[";]/,x)} !/^#/' file 
string3 

x şey temsil eder. Ayrıca "" kullanılan, ancak bir şans sed vermek istiyorsanız bir karakter :)

2

kaydeder olabilirdi:

Eğer `yazdırmak için hangi satır için test öncesi gsub` yoksa
sed -n '/^[^#]/s/[";]//gp' file 
string3 
İlgili konular