Awk alan ayırıcısı olarak “:” nasıl kullanılır?


243

Aşağıdaki komut verildiğinde:

echo "1: " | awk '/1/ -F ":" {print $1}'

awk çıkışı neden:

1: 

Yanıtlar:


382

"-F", awk sözdizimi olmayan bir komut satırı bağımsız değişkenidir, şunu deneyin:

 echo "1: " | awk -F  ":" '/1/ {print $1}'

42
Burada cahil soru: / 1 / bölümü awk'ye sadece 1 sayısını içeren satırları (ya da daha kesin kayıtlar) işlemesini söylemektir.
rantsh

3
@rantsh Awk sözdizimi benzer (pattern){action}. Eğer pattern(çoğunlukla bir koşullu önerme) 'dir doğrudur , actionyürütülür. Eğer patternmevcut değildir, trueima edilir. İşte patternolan /1/devletler hangi regex olan 1cari kayıt eşleşen$0
kvantour

62

Programlı olarak yapmak istiyorsanız, FSdeğişkeni kullanabilirsiniz :

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'

Döngü yerine ana döngüde değiştirirseniz , geçerli satır zaten bölünmüş olduğundan, okunan sonraki satır BEGINiçin etkili olacağını unutmayın .


35

:Ayırıcı olarak ayarlamanın birden çok yolu vardır :

awk -F: '{print $1}'

awk -v FS=: '{print $1}'

awk '{print $1}' FS=:

awk 'BEGIN{FS=":"} {print $1}'

Hepsi eşdeğerdir ve 1"1: 2: 3" örnek girişi için bir geri dönüş sağlar:

$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1

tercih edilen yol hangisidir? BEGINifadesi ile son örnek (genel awksözdizimi ile tutarlı olmak) en doğru olacağını varsayalım .

1
@ randomware hepsi gayet iyi. Her BEGINşeyi saklamak için bir dosya kullanırsam -F, tek gömlekli kullanışlı olur.
fedorqui 'SO

1
Üçüncü dava ile diğer tüm davalar arasında küçük farklılıklar olduğu söylenmelidir. Örnek: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileveawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
kvantour


12

-Fawkkendi başına bir argüman :

$echo "1: " | awk -F":" '/1/ {print $1}'
1

2
Kolon alıntılamaya gerek yok.
ceving

6

Bir regex'i alan ayırıcı olarak da kullanabilirsiniz, aşağıdakiler "10" sayısını ayırıcı olarak ayarlamak için bir regex kullanarak "bar" yazdıracaktır.

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}'

4

Bu kadar yazmaya gerek yok. İstediğiniz alan ayırıcısını awk komutunda -F seçeneğiyle ve yazdırmak istediğiniz sütun numarasını belirtilen alan ayırıcısına göre koyun.

echo "1: " | awk -F: '{print $1}'    
1

echo "1#2" | awk -F# '{print $1}'  
1

4

AWK metin tercüman olarak çalışan tüm belge için linewise gider ve her hat için fieldwise gider her satırın alanlara böylece $ 1, $ 2 .. $ n referanslar (1 $ ilk alandır, $ 2 ikinci alan ve çok açık ...). Komut satırının altındaki "-F" anahtarını kullanarak veya "FS = ..." ile iki parantez içinde bir alan ayırıcı tanımlayabilirsiniz. Şimdi "JUERGEN" cevabını düşünün:

echo "1: " | awk -F  ":" '/1/ {print $1}'

Alan sınırları ":" ile ayarlanır, bu nedenle boş alan olan "1" ve $ 2 olmak üzere iki alanımız vardır. Daha sonra, filtreye yalnızca ilk alanı çıkarmasını bildiren "/ 1 /" normal ifadesi gelir yorumlayıcı böyle bir ifadeyi içeren bir çizgi üzerinde tökezlediğinde (i 1 demek); "Echo" komutunun çıktısı "1" içeren bir satırdır, böylece filtre çalışır ...

Aşağıdaki örnekle uğraşırken:

echo "1: " | awk '/1/ -F ":" {print $1}'

Sözdizimi dağınık ve yorumlayıcı F ":" bölümünü yok saymayı seçti ve boş alan olan varsayılan alan ayırıcıya geçerek birinci alan olarak "1:" çıktısını alıyor ve ikinci bir alan olmayacak!

JUERGEN'in cevabı iyi sözdizimini içeriyor ...


3

Veya şunları kullanabilirsiniz:

echo "1: " | awk  '/1/{print $1-":"}' 

Bu gerçekten komik bir denklem.


1
ne /1/demek

Bir desen bulun. Bu durumda "1"
José Dias
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.