Saya mendapatkan output dari program yang pertama kali menghasilkan satu baris yang merupakan sekelompok tajuk kolom, dan kemudian sekelompok baris data. Saya ingin memotong berbagai kolom dari output ini dan melihatnya diurutkan berdasarkan berbagai kolom. Tanpa tajuk, pemotongan dan pemilahan mudah dilakukan melalui -k
opsi untuk sort
bersama dengan cut
atau awk
untuk melihat bagian dari kolom. Namun, metode penyortiran ini mencampur header kolom dengan sisa garis output. Apakah ada cara mudah untuk menjaga header di atas?
text-processing
sort
table
jonderry
sumber
sumber
{ head -1; sort; }
untuk bekerja. Itu selalu menghapus banyak teks setelah baris pertama. Apakah ada yang tahu mengapa hal ini terjadi?head
membaca lebih dari satu baris ke buffer dan membuang sebagian besar darinya.sed
Ide saya punya masalah yang sama.lseek
input yang dapat sehingga tidak akan berfungsi saat membaca dari sebuah pipa. Ini akan berfungsi jika Anda mengarahkan ulang ke file>outfile
dan kemudian menjalankan{ head -n 1; sort; } <outfile
Jawaban:
Mencuri ide Andy dan menjadikannya fungsi agar lebih mudah digunakan:
Sekarang saya bisa melakukan:
sumber
ps -C COMMAND
mungkin lebih tepat daripadagrep COMMAND
, tapi itu hanya sebuah contoh. Selain itu, Anda tidak dapat menggunakan-C
jika Anda juga menggunakan opsi pemilihan lain seperti-U
.body
? Seperti dalambody sort
ataubody grep
. Pikiran?header
menjadibody
, karena Anda melakukan aksi pada tubuh. Semoga itu lebih masuk akal.body
semua peserta saluran pipa berikut:ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
ataubody sort -k2 <foo
. Hanya satu karakter tambahan dari apa yang Anda inginkan.Anda dapat menjaga tajuk di bagian atas seperti ini dengan bash:
Atau lakukan dengan perl:
sumber
{}
ok()
?IFS=
menonaktifkan pemisahan kata saat membaca input. Saya pikir itu tidak perlu ketika membaca$REPLY
.echo
akan memperluas backslash lolos jikaxpg_echo
diatur (bukan default);printf
lebih aman dalam hal itu.echo $REPLY
tanpa kutipan akan memadatkan spasi putih; Saya pikirecho "$REPLY"
harus baik-baik saja.read -r
diperlukan jika input mungkin berisi garis miring terbalik. Beberapa dari ini mungkin tergantung pada versi bash.read REPLY; echo $REPLY
(strip memimpin ruang) danread; echo $REPLY
(tidak).xpg_echo
tergantung pada sistem Anda, misalnya pada Solaris Saya pikir itu default ke true. Inilah mengapa Gillesprintf
sangat menyukai : itu satu-satunya hal dengan perilaku yang dapat diprediksi.Saya menemukan versi awk yang bagus yang bekerja dengan baik dalam skrip:
sumber
sort
perintah secara eksternal? Apakah ada yang tahu setidaknya tautan ke halaman yang menjelaskan penggunaan pipa dalam awk?Meretas tetapi efektif: tambahkan terlebih dahulu
0
ke semua baris tajuk dan1
ke semua baris lain sebelum mengurutkan. Strip karakter pertama setelah mengurutkan.sumber
Inilah beberapa noise perl line ajaib yang dapat Anda gunakan untuk mengurutkan semuanya untuk mengurutkan semuanya tetapi pertahankan baris pertama di atas:
perl -e 'print scalar <>, sort <>;'
sumber
Saya mencoba
command | {head -1; sort; }
solusinya dan dapat mengonfirmasi bahwa itu benar-benar mengacaukan segalanya -head
dibaca dalam beberapa baris dari pipa, kemudian hanya keluaran yang pertama. Jadi sisa dari output, yanghead
tidak membaca, diteruskan ke -sort
TIDAK sisa output mulai dari baris 2!Hasilnya adalah bahwa Anda kehilangan baris (dan satu baris parsial!) Yang ada di awal output perintah Anda (kecuali Anda masih memiliki baris pertama) - fakta yang mudah untuk dikonfirmasi dengan menambahkan pipa ke
wc
pada akhir pipa di atas - tetapi itu sangat sulit dilacak jika Anda tidak tahu ini! Saya menghabiskan setidaknya 20 menit mencoba mencari tahu mengapa saya memiliki garis parsial (100 byte pertama atau lebih terputus) dalam output saya sebelum menyelesaikannya.Apa yang akhirnya saya lakukan, yang bekerja dengan indah dan tidak perlu menjalankan perintah dua kali, adalah:
Jika Anda perlu memasukkan output ke file, Anda dapat memodifikasi ini ke:
sumber
head
builtin ksh93 atauline
utilitas (pada sistem yang masih memiliki satu) ataugnu-sed -u q
atauIFS=read -r line; printf '%s\n' "$line"
, yang membaca input satu byte pada satu waktu untuk menghindari itu.Saya pikir ini paling mudah.
atau ini yang mungkin lebih cepat karena tidak membuat sub shell
Penggunaan keren lainnya
garis acak setelah baris tajuk
garis terbalik setelah baris tajuk
sumber
cat file | { head -n 1 ; sort ; } > file2
hanya kepala pertunjukansumber
command
dua kali. Karena itu terbatas pada beberapa perintah tertentu. Namun, untukps
perintah yang diminta dalam contoh, itu akan berhasil.Sederhana dan mudah!
sumber
command
dua kali. Jadi tidak benar-benar cocok untuk digunakan dalam saluran pipa.Saya datang ke sini mencari solusi untuk perintah itu
w
. Perintah ini menunjukkan detail siapa yang masuk dan apa yang mereka lakukan.Untuk menunjukkan hasil yang diurutkan, tetapi dengan header tetap di atas (ada 2 baris header), saya memutuskan:
Jelas ini menjalankan perintah
w
dua kali dan karenanya mungkin tidak cocok untuk semua situasi. Namun, untuk keuntungannya secara substansial lebih mudah diingat.Perhatikan bahwa
tail -n +3
sarana 'tunjukkan semua garis dari tanggal 3 dan seterusnya' (lihatman tail
untuk perincian).sumber
Coba lakukan:
sumber