Apakah ada cara untuk head
/ tail
dokumen dan mendapatkan output terbalik; karena Anda tidak tahu ada berapa baris dalam dokumen?
Yaitu saya hanya ingin mendapatkan semuanya kecuali 2 baris pertama foo.txt
untuk ditambahkan ke dokumen lain.
text-processing
tail
head
chrisjlee
sumber
sumber
\n
" .. Ia berfungsi untuk semua bilangan bulat negatif selain-n -0
yang tidak mengembalikan apa-apa , sama seperti-n 0
(menggunakan: head (GNU coreutils) 7.4) ... Namun ketika sebuah trailing\n
hadir,-n -0
apakah mencetak seperti yang mungkin diharapkan dari-
, yaitu. itu mencetak seluruh file ... Jadi itu berfungsi untuk semua nilai negatif yang tidak nol .. tetapi-0
gagal ketika tidak ada trailing\n
head -n -2
tidak kompatibel dengan POSIX .Jika Anda ingin semua kecuali saluran N-1 pertama, hubungi
tail
nomor yang ada+N
. (Angka adalah angka dari baris pertama yang ingin Anda pertahankan, mulai dari 1, yaitu +1 berarti mulai dari atas, +2 berarti lewati satu baris dan seterusnya).Tidak ada cara mudah dan portabel untuk melewati garis N terakhir. GNU
head
memungkinkanhead -n +N
sebagai bagian daritail -n +N
. Jika tidak, jika Anda memilikitac
(mis. GNU atau Busybox), Anda dapat menggabungkannya dengan tail:Portable, Anda dapat menggunakan filter awk (belum diuji):
Jika Anda ingin menghapus beberapa baris terakhir dari file besar, Anda dapat menentukan byte offset potongan untuk memotong kemudian melakukan pemotongan dengan
dd
.Anda tidak dapat memotong file di tempat di awal, meskipun jika Anda perlu menghapus beberapa baris pertama dari file besar, Anda dapat memindahkan konten di sekitar .
sumber
Dari
tail
halaman manual (GNUtail
, yaitu):Dengan demikian, berikut ini harus menambahkan semua kecuali 2 baris pertama
somefile.txt
keanotherfile.txt
:sumber
Untuk menghapus n baris pertama, GNU sed dapat digunakan. Misalnya jika n = 2
The
!
berarti "mengecualikan interval ini". Seperti yang dapat Anda bayangkan, hasil yang lebih rumit dapat diperoleh, misalnyaitu akan menunjukkan baris 3,4,5,7. Lebih banyak kekuatan berasal dari penggunaan ekspresi reguler, bukan alamat.
Batasannya adalah bahwa nomor garis harus diketahui sebelumnya.
sumber
sed 1,2d
? Simpler biasanya lebih baik. Juga, tidak ada dalam contoh Anda yang spesifik untuk GNU Sed; perintah Anda semua menggunakan fitur POSIX standar Sed .Anda dapat menggunakan
diff
untuk membandingkan output darihead
/tail
ke file asli dan kemudian menghapus apa yang sama, sehingga mendapatkan kebalikannya.sumber
Sedangkan
tail -n +4
untuk output file mulai dari baris ke-4 (semua kecuali 3 baris pertama) adalah standar dan portabel,head
rekannya (head -n -3
, semua kecuali 3 baris terakhir) tidak.Mudah dibawa, Anda akan melakukan:
Atau:
(Waspadalah bahwa pada beberapa sistem di mana
sed
memiliki ruang pola ukuran terbatas, yang tidak skala ke nilai besarn
).Atau:
sumber
Jika
<infile
file biasa,lseek()
-able, maka ya, tentu saja, silakan saja. Di atas adalah konstruk yang sepenuhnya didukung POSIXly.sumber
Pendekatan saya mirip dengan Gilles tapi saya malah membalikkan file dengan kucing dan pipa itu dengan perintah kepala.
tac -r thefile.txt | head thisfile.txt (menggantikan file)
sumber
Semoga saya mengerti dengan jelas kebutuhan Anda.
Anda memiliki beberapa cara untuk menyelesaikan permintaan Anda:
Di mana / etc / passwd adalah file Anda
Solusi ke-2 mungkin bermanfaat jika Anda memiliki file besar:
sumber
Solusi untuk BSD (macOS):
Hapus 2 baris pertama:
Hapus 2 baris terakhir:
... tidak terlalu elegan tetapi menyelesaikan pekerjaan!
sumber