Awk sort 3. sütuna göre nasıl kullanılır


92

Bunun gibi bir dosyam (user.csv) var

ip,hostname,user,group,encryption,aduser,adattr

tüm sütun sıralamasını kullanıcıya göre yazdırmak istiyorsanız,

Denedim awk -F ":" '{print|"$3 sort -n"}' user.csv, çalışmıyor.


12
sort -t, -k3 file
— Kevin

Yanıtlar:


181

Peki ya sadece sort.

sort -t, -nk3 user.csv

nerede

  • -t,- sınırlayıcınızı olarak tanımlar ,.

  • -n- size sayısal sıralama verir. Denemenize eklediğinizden beri eklendi. Kullanıcı alanınız yalnızca metin ise, ihtiyacınız yoktur.

  • -k3- alanı (anahtar) tanımlar. kullanıcı üçüncü alandır.


2
Sıralama 2 sütunu nasıl kullanabilirim? örneğin, önce 6. sütuna göre ve 3. sütuna göre sıralamak istiyorum.
— user2452340

1
CSV'de virgül içeren tırnak içine alınmış dizeler varsa (sıralamak istediğiniz sütun, virgül içeren sütundan önce değilse) bu işe yaramaz. Önce awk ile bir geçiş yapmanız gerekebilir (FPAT = "[^,] * | \" [^ \ "] * \" "ve OFS =" | "veya sıralama ile kullanabileceğiniz başka bir sınırlayıcı kullanarak)
— davemyron

1
@ user2452340 Bunu yapabilirsiniz: sort -t, -nk3 filename.csv | sort -t, -nk6- önce sütun 3'e göre sıralayacak, sonra bunu sütun 6'ya göre sıralayacaktır, böylece sütun 6 tamamen doğru sıralanır ve sütun 6'nın aynı olduğu tüm satırlar için bunlar sütun 3'e göre sıralanır .
— Matthew

3
@Matthew sort -t ',' -k3,3n -k6,6ndaha iyi olacak. -k33. sütunu ve satırın geri kalanını kullanacaktır.
— Kusalananda

1
2 sütun dosyamı virgülle bölmek için -t'ye ihtiyacım vardı, teşekkürler jaypal
— Ricardo Rivera Nieves

23
  1. Kullanıcı kimliğini öne koymak için awk kullanın.
  2. Çeşit
  3. Kullanıcı kimliklerinin boşluk içermediğini varsayarak yinelenen kullanıcı kimliğini kaldırmak için sed kullanın.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Bu çok kullanışlıdır, özellikle bir sıralama alanı eklemek için sütunları ayrıştırmanız veya birleştirmeniz gerekiyorsa, ardından yalnızca orijinal satırı koruyun. Bir sıralama için tarih ve saat alanlarını ayrıştırmak / birleştirmek için awk / split kullandım, sonra kaldırdım.
— skytaker

1
sortBelirli bir sütuna göre nasıl sıralama yapılacağını zaten biliyor, ancak Schwartzian dönüşümü olarak bilinen bu teknik , sıralamak istediğiniz alan önemsiz bir şekilde iyi tanımlanmış bir sütun olmadığında kullanışlıdır.
— üçlü

11

Bir sınırlayıcı seçebilirsiniz, bu durumda iki nokta üst üste seçtim ve alfabetik sıraya göre sıralayarak birinci sütunu yazdırdım:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

ve ters sıra için

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

6

bunu dene -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

VEYA

sort -t',' -nk3 user.csv


0

İlk satırı (başlık) sıralama dışında bırakmak için, onu iki tampona bölerim.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
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.