Yanıtlar:
"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 -F"," ...- virgülle ayırır (yani ,).cut -d"," ...- virgülle ayırır (yani ,).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.
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.
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.
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 .
cutsorulan soru tarafından kullanılmaz.
cut -d "$IFS"hata verir, awk -F"[ \t\n]"beklendiği gibi çalışır
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.
"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
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
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.
echo '$IFS' | cat -vetgibi nasıl varsayılan değer görünüyor görmek içinshell.