Yanıtlar:
"Alan" terimi genellikle cut
ve 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, cut
1 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 cut
belirtilen 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ı cut
ve 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, -s
anahtarı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 .
cut
sorulan 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 cut
bir 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: -f2
birinci 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ı awk
ise 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 :cut
awk
awk
awk '{print $2}'
sort
beni kandırıyor. Geçerli sort
kılavuz sayfam, alan ayırıcı için "boş olmayandan boşa geçiş" gibi bir şey söylüyor. Bazı nedenlerden dolayı, sort
alanları doğru şekilde tanımlamak için birkaç deneme yapmanız gerekir . join
Görünüşe göre "boşlukla sınırlandırılmış" alanları kullanıyor, bu awk
varsayı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 cut
farklı 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 -d
ve -f
alabilirsiniz:
echo 'a:b:c::d:e:f' | cut -d : -f 2-3,6
cut
Komutu 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 output
ayı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
cut
sı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
).
awk
tek satırlar çok daha esnektir; örneğin, giriş alanı ayırıcı herhangi bir boşluk ( awk
varsayı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 sort
anlaşılması zor! Alanlar join
ile aynı çalışmıyor gibi görünüyor cut
olsa da, join
seçenekler yanlış kolaydır.
echo '$IFS' | cat -vet
gibi nasıl varsayılan değer görünüyor görmek içinshell
.