Saya ingin mencetak baris dari file mundur tanpa menggunakan tac
perintah. Apakah ada solusi lain untuk melakukan hal seperti itu dengan bash?
shell
text-processing
jimmij
sumber
sumber
Jawaban:
Menggunakan
sed
untuk menirutac
:sumber
sed
one-liner yang terkenal . Lihat "36. Membalik urutan baris (meniru" tac "perintah Unix)." dalam Famous Sed One-Liners Dijelaskan untuk penjelasan lengkap tentang cara kerjanya.sort
- ada kemungkinan itu akan menggunakan file sementara).Dengan
ed
:Jika Anda menggunakan
BSD
/OSX
(dan semoga segera diGNU
/linux
juga karena POSIX ):sumber
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
via awk satu liners
sumber
awk 'a=$0RS a{}END{printf a}'
but your first
perl membalikkan <> `itu jawaban terbaik / tercepat pada halaman (untuk saya), pada 10 kali lebih cepat dariawk
jawaban ini (semua awk anseres hampir sama,awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Saat Anda diminta untuk melakukannya di bash, berikut adalah solusi yang tidak menggunakan awk, sed atau perl, hanya fungsi bash:
Output dari
aku s
Seperti yang diharapkan.
Tetapi berhati-hatilah bahwa garis-garis disimpan dalam memori, satu baris di masing-masing secara rekursif disebut instance dari fungsi. Jadi hati-hati dengan file besar.
sumber
Anda dapat menyalurkan melalui:
The
awk
prefiks setiap baris dengan nomor baris diikuti dengan spasi. Thesort
membalikkan urutan garis dengan mensortir field pertama (nomor baris) dalam urutan terbalik, gaya numerik. Dansed
strip dari nomor baris.Contoh berikut menunjukkan ini dalam tindakan:
Ini menghasilkan:
sumber
cat -n
bertindak sepertiawk '{print NR" "$0}'
Dalam perl:
sumber
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
cepat: bagus! tetapi yang "benar-benar jelek" sangat lambat karena jumlah garis meningkat. !! ....-n
itu berlebihan di sana, terima kasih.sort
).Solusi khusus BASH
baca file menjadi bash array (satu baris = satu elemen array) dan cetak array dalam urutan terbalik:
sumber
while..read
.IFS=''
danread -r
untuk mencegah semua jenis lolos dan tertinggal penghapusan IFS dari mengacaukannya. Saya pikir bashmapfile ARRAY_NAME
builtin adalah solusi yang lebih baik untuk membaca array.Bash, dengan
mapfile
disebutkan dalam komentar untuk fiximan, dan sebenarnya versi yang mungkin lebih baik:Kinerjanya pada dasarnya sebanding dengan
sed
solusi, dan semakin cepat karena jumlah baris yang diminta berkurang.sumber
sumber
seperti yang ditunjukkan di sini:
Hasil:
sumber
sumber