Apakah ada cara singkat untuk menyimpan output pipa ke file yang sama yang sedang diproses. Sebagai contoh, inilah yang sebenarnya saya lakukan
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Saya bertanya-tanya apakah ada cara untuk melakukannya hanya dalam satu baris (tidak menambahkan perintah-perintah itu menggunakan &&)
Ini bukan caranya, tetapi untuk mendapatkan ide
$ cat filename | sort | uniq > filename
command-line
bash
whitenoisedb
sumber
sumber
echo $(cat filename | sort | uniq > result) > filename
atau sesuatu ? Hanya lewat, saya tidak punya waktu untuk mencobanya.Jawaban:
Anda dapat menggunakan
sponge
dari paket moreutils :Anda juga tidak perlu menggunakan pipa
uniq
, karena ketikasort
memiliki-u
opsi untuk garis unik saat menyortir.Perhatikan bahwa pada sistem GNU dengan lokal UTF-8,
sort -u
atausort | uniq
tidak memberi Anda garis unik, tetapi yang pertama dari urutan garis yang mengurutkan yang sama di lokal saat ini.hanya memberimu
①
. Mengubah lokal ke C memaksa urutan penyortiran berdasarkan nilai byte:sumber
Anda tidak memerlukan perintah tambahan seperti
cat
danuniq
dan juga tanpa menggunakanrm
perintah danmv
perintah untuk menghapus dan mengganti nama file. cukup gunakan perintah sederhana.Bagaimana cara kerjanya?
sort
Perintah mengurutkan nama file Anda dan dengan-u
opsi, menghapus garis duplikat dari itu. kemudian dengan-o
opsi tulis output ke file yang sama dengan metode in place.sumber
sort
berjalan, Anda akan kehilangan file asli Anda.Contoh yang Anda sarankan (di bawah) tidak berfungsi karena Anda sebenarnya akan membaca dan menulis ke file yang sama secara bersamaan.
Gagasan dengan pipa atau pengalihan adalah bahwa perintah di sisi kiri dan kanan setiap pipa atau pengalihan berjalan secara bersamaan, secara paralel. Perintah di sebelah kanan memproses informasi saat diserahkan dari perintah di sebelah kiri, sementara perintah di sebelah kiri masih berjalan.
Agar skenario Anda berfungsi, perintah yang membaca dari file harus selesai sebelum perintah yang menulis ke file dimulai. Agar ini berfungsi, Anda harus mengarahkan output ke lokasi sementara terlebih dahulu, kemudian setelah selesai, kirim kembali dari lokasi sementara kembali ke file.
Cara yang lebih baik untuk melakukan ini pada dasarnya adalah seperti pada contoh sebelumnya, di mana Anda mengarahkan ulang ke file sementara kemudian mengganti nama file itu kembali ke aslinya (kecuali bahwa Anda tidak perlu menghapus file terlebih dahulu, karena memindahkan menghapus target yang ada) .
Anda juga bisa menyimpannya ke dalam variabel string, kecuali itu hanya berfungsi ketika data cukup kecil untuk semua dapat disimpan dalam memori sekaligus.
sumber
cat filename | sort
menjadi adilsort filename
-cat
tidak perlu di sini.cat
mungkin tidak perlu dalam kasus ini tetapi saya fokus pada bagian pengalihan.Anda dapat menggunakan
tee
perintah:The
tee
perintah membaca dari input standar dan menulis ke output standar dan file.sumber
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
berfungsi. Seperti pos asli, ini tidak berfungsi jika Anda hanya> ~/file
tanpatee
. Tee tampaknya serupa di sinisort -o file
, yang menulis ke file bernama tanpa melanjutkan pipa yang sama.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
Saya merekomendasikan file temp danmv
atau mungkin solusi dari tautan @ Steven.Anda dapat menggunakan Vim dalam mode Ex:
sort u
semacam unikx
tulis jika ada perubahan (sudah) dan berhentisumber