Kesme komutu için bir 'alan' nedir?


16

Örneğin, cutkomut -f parametresini alabilir.man

sadece bu alanları seçin; -s seçeneği belirtilmedikçe sınırlayıcı karakter içermeyen herhangi bir satırı da yazdır

Bu bağlamda, alan nedir?

Yanıtlar:


19

"Alan" terimi genellikle cutve gibi araçlarla ilişkilendirilir awk. Verileri alıp belirli bir karakter kullanarak ayırırsanız, alan veri değerine sahip sütunlara benzer. Genellikle bunu yapmak için kullanılan karakter a Space.

Bununla birlikte, çoğu araçta olduğu gibi, yapılandırılabilir. Örneğin:

  • awk = awk -F"," ...- virgülle ayırır (yani ,).
  • cut = cut -d"," ...- virgülle ayırır (yani ,).

Örnekler

Bu birincisi awk, alanlara otomatik olarak nasıl bölüneceğini gösterir .

$ echo "The rain in Spain." | awk '{print $1" "$4}'
The Spain.

Bu cut, uzaylarda da nasıl bölüneceğini gösterir .

$ echo "The rain in Spain." | cut -d" " -f1,4
The Spain.

Burada, cut1 ve 4 numaralı sütunları döndürmek için kullandığımız bir CSV sütun verileri listemiz var .

$ echo "col1,col2,col3,co4" | cut -d"," -f1,4
col1,co4

Awk da bunu yapabilir:

$ echo "col1,col2,col3,co4" | awk -F"," '{print $1","$4}'
col1,co4

Awk ayrıca çeşitli ayırma karakterleriyle uğraşmada biraz daha beceriklidir. İşte aşar Tabsbirlikte Spacesaynı anda birbirleriyle karıştırılıyor olduğun yerde:

$ echo -e "The\t rain\t\t in Spain." | awk '{print $1" "$4}'
The Spain.

Kesmek için -s anahtarına ne dersiniz?

Bu anahtarla ilgili olarak, yalnızca anahtarla cutbelirtilen sınırlayıcı karakteri içermeyen hiçbir satır yazdırılmamasını söyler -d.

Misal

Diyelim ki bu dosyamız var.

$ cat sample.txt 
This is a space string.
This is a space   and   tab string.
Thisstringcontainsneither.

NOT: Yukarıdaki 2. dizede boşluklar ve sekmeler vardır.

Şimdi bu dizeleri anahtarlı cutve anahtarsız olarak işlediğimizde -s:

$ cut -d" " -f1-6 sample.txt 
This is a space string.
This is a space  
Thisstringcontainsneither.

$ cut -d" " -f1-6 -s sample.txt 
This is a space string.
This is a space  

2. örnekte, -sanahtarın çıkıştan ayırıcı içermeyen tüm dizeleri atladığını görebilirsiniz Space.


8

POSIX'e göre bir alan, satırın IFS" giriş alanı ayırıcısı (veya dahili alan ayırıcısı ) içindeki herhangi bir karakterle ayrılmış herhangi bir bölümüdür . Bunun varsayılan değeri boşluk, ardından yatay bir tabülatör ve ardından yeni satır gelir . Bash ile printf '%q\n' "$IFS"değerini görmek için koşabilirsiniz .


Bir Do echo '$IFS' | cat -vet gibi nasıl varsayılan değer görünüyor görmek için shell.
C0deDaedalus

1
IFS, kabuk tarafından çoğu amaç için (hepsi değil) kullanılır, ancak diğer programlar tarafından kullanılmaz ve özellikle cutsorulan soru tarafından kullanılmaz.
dave_thompson_085

Awk'den farklı olarak, kesim aynı anda sadece bir sınırlayıcıyı destekler, bu yüzden cut -d "$IFS"hata verir, awk -F"[ \t\n]"beklendiği gibi çalışır
JGurtz

2

Söz konusu yardımcı programa bağlıdır, ancak cutbir metin alanının başlangıcında bir "alan" başlar ve ilk sekmeye kadar olan her şeyi içerir. İkinci alan ilk sekmeden sonraki karakterden sonraki sekmeye kadar devam eder. Ve böylece üçüncü, dördüncü için ... Sekmeler arasındaki veya satır başı ile sekme arasındaki veya sekme ile satır sonu arasındaki her şey.

"-D" seçeneğiyle bir alan sınırlayıcısı belirtmedikçe: cut -d: -f2birinci ve ikinci iki nokta üst üste (':') karakterleri arasındaki her şeyi alırsınız.

Diğer yardımcı programların farklı tanımları vardır, ancak bir sekme karakteri yaygındır. alanları bir veya daha fazla boşluk karakterine göre böldüğü için çok katı awkise iyi bir geri dönüştür . Bu, birçok durumda biraz daha doğaldır, ancak biraz sözdizimi bilmeniz gerekir. İkinci alanı aşağıdakilere göre yazdırmak için :cutawkawk

awk '{print $2}'

sortbeni kandırıyor. Geçerli sortkılavuz sayfam, alan ayırıcı için "boş olmayandan boşa geçiş" gibi bir şey söylüyor. Bazı nedenlerden dolayı, sortalanları doğru şekilde tanımlamak için birkaç deneme yapmanız gerekir . joinGörünüşe göre "boşlukla sınırlandırılmış" alanları kullanıyor, bu awkvarsayılan olarak yapılması düşünülen şeydir .

Hikayenin ahlakı dikkatli olmak ve bilmiyorsanız deney yapmaktır.


2

"Alan" terimi genel olarak linux ile değil, belirli programlarla ilgilidir. Bu yüzden cutfarklı bir alan kullanır sort.

İle cut, her satırdaki alanları ayıran -d seçeneğiyle bir alan sınırlayıcısı belirterek alanın ne olduğunu kendiniz tanımlarsınız.

Verileriniz satırlardaki iki nokta üst üste işaretiyle ayrılmışsa, 2, 3 ve 6 alanlarını (veya sütunları) aşağıdaki gibi birleştirebilir -dve -falabilirsiniz:

echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6

1

cutKomutu kullandığınızda iki ana argüman alır

-d: ayırıcı anlamına gelir

-f: giriş dosyasından kesilecek alan anlamına gelir

Ex. cut - d "|"  - f1, 2 input_filename

Burada outputayırıcı "|" ile ayrılır ve giriş dosyasından sadece 2 alan kesecek

Dosyanızda aşağıdaki satırlar varsa

Alex|120000|Admin|1999

Sonra 2 alan kesecek

Alex|120000

Örneğiniz yanlış boşluklar nedeniyle tamamen kırılmıştır ve doğru olsa bile 4 yıl önce verilen cevaplara hiçbir şey katmaz.
dave_thompson_085

0

cutsınırlayıcının tek bir karakter olduğu ve giriş alanlarının bir alt kümesini aynı sırayla çıkarmak istediğiniz basit durumlar için idealdir (belirtmiş olsam bile -f3,2,1, aynı davranır -f1,2,3).

awktek satırlar çok daha esnektir; örneğin, giriş alanı ayırıcı herhangi bir boşluk ( awkvarsayılan) olduğunda veya alanları farklı bir sırada veya belirli bir biçimde çıkarmak istediğinizde.

Örneğin wc -l myfile | awk '{print $1}'ya ls -l file1 file2 | awk '{printf "%s,%s:%s\n", $9, $7, $3}'da çok basit, ama yapmak zor olurdu cut.

Önceki posterlere katılıyorum, alanların / anahtarların sortanlaşılması zor! Alanlar joinile aynı çalışmıyor gibi görünüyor cutolsa da, joinseçenekler yanlış kolaydır.

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.