it-swarm-tr.com

üstbilgiyi sırala ama üstte tut

Ben ilk sütun başlıkları bir grup bir satır ve daha sonra veri satırları bir satır üreten bir programdan çıktı alıyorum. Bu çıktının çeşitli sütunlarını kesmek ve çeşitli sütunlara göre sıralanmış olarak görüntülemek istiyorum. Başlıklar olmadan, kesme ve ayırma işlemi -k sütunlarının bir alt kümesini görüntülemek için sort veya cut veya awk seçeneği. Bununla birlikte, bu sıralama yöntemi, sütun başlıklarını geri kalan çıktı satırlarıyla karıştırır. Üstbilgileri en üstte tutmanın kolay bir yolu var mı?

63
jonderry

Andy'nin fikrini çalmak ve bir işlev haline getirmek, böylece kullanımı daha kolay:

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "[email protected]"
}

Şimdi yapabilirim:

$ ps -o pid,comm | body sort -k2
  PID COMMAND
24759 bash
31276 bash
31032 less
31177 less
31020 man
31167 man
...

$ ps -o pid,comm | body grep less
  PID COMMAND
31032 less
31177 less
66
Mikel

Üstbilgiyi bash ile aşağıdaki gibi tutabilirsiniz:

command | (read -r; printf "%s\n" "$REPLY"; sort)

Veya Perl ile yapın:

command | Perl -e 'print scalar (<>); print sort { ... } <>'
41
Andy

Ben buldum güzel bir awk sürümü komut dosyalarında güzel çalışır:

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}'
30
Michael Kuhn

Hackish ama etkili: prepend 0 tüm başlık satırlarına ve 1 sıralamadan önce diğer tüm satırlara. Sıralamadan sonra öneki soyun.

… |
awk '{print (NR <= 2 ? "0 " : "1 ") $0}' |
sort -k 1 -k… |
cut -b 3-

İşte her şeyi sıralamak, ancak ilk satırı en üstte tutmak için çıktınızı yönlendirebileceğiniz sihirli Perl hattı gürültüsü: Perl -e 'print scalar <>, sort <>;'

4
Ryan C. Thompson

command | {head -1; sort; } Çözümünü denedim ve gerçekten işleri mahvediyor --head borudan birden fazla satır okuduğunu, sonra sadece birincisini çıkardığını doğrulayabilirim. Böylece çıktının geri kalanı, head okunmamış , sort-- geri kalanına DEĞİL çıkış 2 satırdan başlayarak!

Sonuç, komut çıkışınızın başında olan satırları (ve bir kısmi satırı!) Kaçırmanızdır (yine de ilk satırınız hariç) - wc yukarıdaki boru hattının sonunda - ama bunu bilmiyorsanız bu izini izlemek çok zor! Çözmeden önce çıkışımda neden kısmi bir satır (ilk 100 bayt veya daha fazla kesilmiş) olduğunu anlamaya çalışırken en az 20 dakika geçirdim.

Sonunda güzel çalıştım ve iki kez komutu çalıştırmayı gerektirmeyen şey:

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile
sed 1d $myfile | sort

rm $myfile

Çıktıyı bir dosyaya koymanız gerekirse, bunu şu şekilde değiştirebilirsiniz:

myfile=$(mktemp)
whatever command you want to run > $myfile

head -1 $myfile > outputfile
sed 1d $myfile | sort >> outputfile

rm $myfile
2
Wildcard

Bence bu en kolayı.

ps -ef | ( head -n 1 ; sort )

ya da alt Kabuk oluşturmadığından daha hızlı olan

ps -ef | { head -n 1 ; sort ; }

Diğer havalı kullanımlar

üstbilgi satırından sonra satırları karıştır

cat file.txt |  ( head -n 1 ; shuf )

üstbilgi satırından sonra ters satırlar

cat file.txt |  ( head -n 1 ; tac )
1
user2449151
command | head -1; command | tail -n +2 | sort
0
Sarva

Buraya w komutu için bir çözüm aramaya geldim. Bu komut, oturum açmış olanların ve ne yaptıklarının ayrıntılarını gösterir.

Sonuçları sıralanmış olarak göstermek için, ancak başlıklar en üstte tutulurken (2 başlık satırı vardır),

w | head -n 2; w | tail -n +3 | sort

Açıkçası bu, w komutunu iki kez çalıştırır ve bu nedenle tüm durumlar için uygun olmayabilir. Bununla birlikte, avantajına göre hatırlanması oldukça kolaydır.

tail -n +3 '3.dan itibaren tüm satırları göster' anlamına gelir (bkz. man tail detaylar için).

0
Robert

Basit ve anlaşılır!

<command> | head -n 1; <command> | sed 1d | sort <....>
  • sed nd ---> 'n' satır numarasını belirtir ve 'd' silme anlamına gelir.
0
Jatsui