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.