Saya memiliki file fixed-width-field yang saya coba sortir menggunakan utilitas sortir UNIX (Cygwin, dalam kasus saya).
Masalahnya adalah ada dua baris header di bagian atas file yang sedang diurutkan ke bagian bawah file (karena setiap baris header dimulai dengan titik dua).
Apakah ada cara untuk mengetahui pengurutan "lewati dua baris pertama melintasi tanpa urutan" atau untuk menentukan urutan yang mengurutkan garis titik dua ke atas - baris yang tersisa selalu dimulai dengan angka 6 digit (yang sebenarnya adalah kunci I sedang menyortir) jika itu membantu.
Contoh:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
harus diurutkan ke:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
unix
sorting
command-line
Rob Gilliam
sumber
sumber
Jawaban:
Tanda kurung membuat subkulit, membungkus stdout sehingga Anda dapat menyalurkannya atau mengalihkannya seolah-olah itu berasal dari satu perintah.
sumber
tee >(head -n $header_size) | tail -n +$header_size | sort
, tetapi kepala tampaknya berjalan setelahtail|sort
pipa, jadi header akhirnya dicetak pada akhirnya. Apakah ini deterministik atau kondisi ras?cat
untuk mengarahkan stdin ke file sementara, lalu menjalankan perintah di atas pada file baru itu, tetapi itu mulai menjadi cukup jelek sehingga mungkin lebih baik menggunakan salah satu solusi berbasis awk yang diberikan di tanggapan lainnya.Jika Anda tidak keberatan menggunakannya
awk
, Anda dapat memanfaatkanawk
kemampuan pipa bawaanmisalnya.
Ini mencetak dua baris pertama secara verbatim dan menyalurkan sisanya melalui
sort
.Perhatikan bahwa ini memiliki keuntungan yang sangat spesifik karena dapat secara selektif mengurutkan bagian dari input yang disalurkan. semua metode lain yang disarankan hanya akan mengurutkan file biasa yang dapat dibaca berkali-kali. Ini bekerja pada apa saja.
sumber
$0
,print
sudah cukup.Berikut adalah versi yang berfungsi pada data beralur:
Jika tajuk Anda memiliki banyak baris:
Solusi ini dari sini
sumber
extract_data | (read h; echo "$h"; sort)
cukup pendek untuk diingat. contoh Anda mencakup lebih banyak kasus tepi. :) Ini adalah jawaban terbaik. bekerja di pipa. tidak awk.extract_data | (read; sort)
Dalam kasus sederhana,
sed
dapat melakukan pekerjaan dengan elegan:atau setara,
Kuncinya ada di
1q
- cetak baris pertama (header) dan keluar (biarkan sisa masukan kesort
).Untuk contoh yang diberikan,
2q
akan melakukan triknya.The
-u
switch (unbuffered) diperlukan untuk merekased
s (terutama, GNU) yang lain akan membaca masukan dalam potongan, sehingga mengkonsumsi data yang Anda ingin pergi melaluisort
sebagai gantinya.sumber
Anda dapat menggunakan
tail -n +3 <file> | sort ...
(tail akan menampilkan konten file dari baris ke-3).sumber
contoh:
sumber
Hanya membutuhkan 2 baris kode ...
Untuk data numerik, -n diperlukan. Untuk pengurutan alfa, -n tidak diperlukan.
File contoh:
$ cat test.txt
Hasil:
$ cat a.tmp
sumber
Jadi, inilah fungsi bash di mana argumen persis seperti sort. Mendukung file dan pipa.
Bagaimana itu bekerja. Baris ini memeriksa apakah ada setidaknya satu argumen dan jika argumen terakhir adalah file.
Ini menyimpan file ke argumen terpisah. Karena kami akan menghapus argumen terakhir.
Di sini kami menghapus argumen terakhir. Karena kami tidak ingin menyebarkannya sebagai argumen penyortiran.
Akhirnya, kami melakukan bagian awk, meneruskan argumen (minus argumen terakhir jika itu adalah file) untuk mengurutkan dalam awk. Ini secara orignally disarankan oleh Dave, dan dimodifikasi untuk mengambil argumen semacam itu. Kami mengandalkan fakta bahwa
$file
akan kosong jika kami sedang menyalurkan, sehingga diabaikan.Contoh penggunaan dengan file yang dipisahkan koma.
sumber
Dengan Python:
sumber
Berikut adalah fungsi bash shell yang diturunkan dari jawaban lainnya. Ini menangani file dan pipa. Argumen pertama adalah nama file atau '-' untuk stdin. Argumen yang tersisa diteruskan untuk mengurutkan. Beberapa contoh:
Fungsi shell:
sumber
Ini sama dengan jawaban Ian Sherbin tetapi penerapan saya adalah: -
sumber
Ini akan melakukan apa yang Anda inginkan.
sumber