Saya ingin membalik urutan baris dalam file teks (atau stdin), menjaga konten setiap baris.
Jadi, yaitu, dimulai dengan:
foo
bar
baz
Saya ingin berakhir dengan
baz
bar
foo
Apakah ada utilitas baris perintah UNIX standar untuk ini?
shell
unix
command-line
Scotty Allen
sumber
sumber
perl -e 'print reverse <>'
tetapi mungkin juga berlaku untuk metode lain).Jawaban:
BSD tail:
Referensi: Halaman manual FreeBSD , NetBSD , OpenBSD dan OS X.
sumber
Juga layak disebutkan:
tac
(the, ahem, kebalikan daricat
). Bagian dari coreutils .Membalik satu file ke file lain
sumber
brew install coreutils
(menginstal sebagaigtac
default).echo -n "abc\ndee" > test; tac test
.Ada trik sed yang terkenal :
(Penjelasan: tambahkan baris non-awal untuk menahan buffer, swap line and hold buffer, cetak baris di akhir)
Atau (dengan eksekusi lebih cepat) dari awk one-liners :
Jika Anda tidak dapat mengingatnya,
Pada sistem dengan utilitas GNU, jawaban lain lebih sederhana, tetapi tidak semua dunia adalah GNU / Linux ...
sumber
tail -r
dan tidak .tac
diharapkan untuk menangani file besar sembarang yang tidak muat di memori (panjang jalur masih terbatas). Tidak jelas apakahsed
solusi berfungsi untuk file seperti itu.pada akhir perintah Anda masukkan:
| tac
tac melakukan persis apa yang Anda minta, itu "Tulis setiap FILE ke output standar, baris terakhir terlebih dahulu."
tac adalah kebalikan dari kucing :-).
sumber
tac
perintah, ini berguna untuk pengguna baru yang mungkin akhirnya mencari subjek yang sama.Jika Anda sedang
vim
digunakansumber
contoh:
sumber
Coba
tac
, yang berfungsi di Linux, dan jika itu tidak berfungsi gunakantail -r
, yang bekerja pada BSD dan OSX.sumber
tac myfile.txt
- apa yang saya lewatkan?tail -r
jagatac
- jaga jika tidak tersedia.tac
tidak kompatibel dengan POSIX. Tidak jugatail -r
. Masih tidak aman, tetapi ini meningkatkan peluang bekerja.tac
tersedia, tetapi kehabisan RAM dan menukar setengah jalan melalui mengkonsumsi aliran input raksasa. Gagal, dan kemudiantail -r
berhasil memproses sisa aliran memberikan hasil yang salah.brew install coreutils
dan gunakangtac
di tempattac
dan jika Anda lebih suka menambahkan tac sebagai alias untukgtac
jika misalnya Anda ingin skrip shell yang menggunakannya lintas platform (Linux, OSX)Coba perintah berikut:
sumber
sed 's/^[0-9]*://g'
nl
secara default akan gagal ke nomor baris kosong. The-ba
pilihan tersedia pada beberapa sistem, bukan tidak universal (HP / UX datang ke pikiran, walaupun saya berharap itu tidak akan) sedangkangrep -n
akan selalu jumlah setiap baris yang cocok dengan (dalam hal ini mengosongkan) regex.cut -d: -f2-
Just Bash :) (4.0+)
sumber
-nenenenenenene
dan menyaksikan alasan mengapa orang merekomendasikan selalu menggunakanprintf '%s\n'
bukanecho
.Metode paling sederhana adalah menggunakan
tac
perintah.tac
adalahcat
's terbalik. Contoh:sumber
Saya sangat suka jawaban " tail -r ", tetapi jawaban gawk favorit saya adalah ....
sumber
mawk
Ubuntu 14.04 LTS - berfungsi, jadi tidak spesifik untuk GNU. +1n++
dapat diganti denganNR
EDIT berikut menghasilkan daftar nomor yang diurutkan secara acak dari 1 hingga 10:
di mana titik-titik diganti dengan perintah aktual yang membalikkan daftar
tac
python: using [:: - 1] di sys.stdin
sumber
Untuk solusi lintas OS (yaitu OSX, Linux) yang mungkin digunakan
tac
di dalam skrip shell gunakan homebrew seperti yang telah disebutkan di atas, maka hanya alias tac seperti:Instal lib
Untuk MacOS
Untuk linux debian
Kemudian tambahkan alias
sumber
Ini akan bekerja pada BSD dan GNU.
sumber
Jika Anda ingin memodifikasi file di tempat, Anda dapat menjalankan
Ini menghilangkan kebutuhan untuk membuat file sementara dan kemudian menghapus atau mengganti nama aslinya dan memiliki hasil yang sama. Sebagai contoh:
Berdasarkan jawaban dengan singkat , yang melakukan hampir, tetapi tidak cukup, apa yang saya inginkan.
sumber
Itu terjadi pada saya bahwa saya ingin mendapatkan
n
baris terakhir dari file teks yang sangat besar secara efisien .Hal pertama yang saya coba adalah
tail -n 10000000 file.txt > ans.txt
, tetapi ternyata sangat lambattail
harus mencari ke lokasi dan kemudian bergerak kembali untuk mencetak hasilnya.Ketika saya menyadari itu, saya beralih ke solusi lain:
tac file.txt | head -n 10000000 > ans.txt
. Kali ini, posisi pencarian hanya perlu bergerak dari ujung ke lokasi yang diinginkan dan menghemat waktu 50% !Pesan rumah:
Gunakan
tac file.txt | head -n n
jika Andatail
tidak memiliki-r
opsi.sumber
Solusi terbaik:
sumber
Untuk pengguna Emacs:
C-x h
(pilih seluruh file) laluM-x reverse-region
. Juga berfungsi hanya untuk memilih bagian atau garis dan mengembalikannya.sumber
Saya melihat banyak ide menarik. Tapi coba ide saya. Pipa teks Anda ke ini:
yang mengasumsikan bahwa karakter '~' tidak ada dalam file. Ini harus bekerja pada setiap shell UNIX kembali ke tahun 1961. Atau sesuatu seperti itu.
sumber
Saya memiliki pertanyaan yang sama, tetapi saya juga ingin baris pertama (header) tetap di atas. Jadi saya perlu menggunakan kekuatan awk
PS juga berfungsi di cygwin atau gitbash
sumber
1\n20\n19...2\n
daripada20\n19...\2\n1\n
.Anda dapat melakukannya dengan
vim
stdin
danstdout
. Anda juga dapat menggunakanex
untuk menjadi POSIX compliant .vim
hanyalah mode visual untukex
. Bahkan, Anda dapat menggunakannyaex
denganvim -e
atauvim -E
(ex
mode yang ditingkatkan ).vim
berguna karena tidak seperti alat sepertised
itu buffer file untuk diedit, sementarased
digunakan untuk stream. Anda mungkin dapat menggunakanawk
, tetapi Anda harus secara manual buffer semuanya dalam suatu variabel.Idenya adalah untuk melakukan hal berikut:
g/^/m0
. Ini berarti secara global, untuk setiap barisg
; cocok dengan awal baris, yang cocok dengan apa pun^
; pindahkan setelah alamat 0, yaitu baris 1m0
.%p
. Ini berarti untuk rentang semua lini%
; cetak garisp
.q!
. Ini berarti berhentiq
; dengan paksa!
.Cara membuat ini dapat digunakan kembali
Saya menggunakan skrip yang saya panggil
ved
(vim editor likesed
) untuk menggunakan vim untuk mengeditstdin
. Tambahkan ini ke file yang disebutved
di jalur Anda:Saya menggunakan satu
+
perintah, bukan+'%p' +'q!'
, karena vim membatasi Anda hingga 10 perintah. Jadi menggabungkan mereka memungkinkan"$@"
untuk memiliki 9+
perintah, bukan 8.Maka Anda dapat melakukan:
Jika Anda tidak memiliki vim 8, masukkan ini
ved
sebagai gantinya:sumber
atau
atau
sumber
ekor -r bekerja di sebagian besar sistem Linux dan MacOS
seq 1 20 | ekor -r
sumber
atau
sumber
sort -r
hanya berfungsi jika input sudah diurutkan, yang tidak terjadi di sini.rev
membalikkan karakter per baris tetapi menjaga urutan garis tetap utuh yang juga bukan apa yang diminta Scotty. Jadi jawaban ini sebenarnya tidak ada jawaban sama sekali.