Bagaimana cara menghapus n baris pertama file ascii menggunakan perintah shell?

93

Saya memiliki banyak file yang berisi informasi teks ascii di baris 5-10 pertama, diikuti oleh informasi matriks yang ditabulasi dengan baik. Dalam skrip shell, saya ingin menghapus beberapa baris teks ini sehingga saya dapat menggunakan informasi matriks murni dalam program lain. Bagaimana saya bisa menggunakan perintah bash shell untuk melakukan ini?

Jika ada bantuan, saya menggunakan RedHat dan sistem linux Ubuntu.

Paul
sumber

Jawaban:

144

Selama file tersebut bukan symlink atau hardlink, Anda dapat menggunakan sed, tail, atau awk. Contoh di bawah ini.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

Anda juga dapat menggunakan sed di tempat tanpa temp file: sed -i -e 1,3d yourfile. Ini tidak akan menggemakan apa pun, itu hanya akan mengubah file di tempat. Jika Anda tidak perlu menyalurkan hasilnya ke perintah lain, ini lebih mudah.

ekor

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
Ignacio Vazquez-Abrams
sumber
8
Anda juga dapat menggunakan sed di tempat tanpa temp file: sed -i -e 1,3d yourfile. Ini tidak akan menggemakan apa pun, itu hanya akan mengubah file di tempat. Jika Anda tidak perlu menyalurkan hasilnya ke perintah lain, ini lebih mudah.
Yanick Girouard
1
Terima kasih @YanickGirouard, @IgnacioVazquezAbrams! Kalian berdua baru saja menyelamatkan saya banyak pekerjaan manual pada penelitian saya! :)
Paul
2
@ Selvana sed -ikhusus. Sebagian besar implementasi hanya menghapus file dan menggantinya dengan yang baru, yang tidak berfungsi untuk tautan karena Anda akhirnya meninggalkan yang asli di lokasi lainnya.
jw013
6
bagaimana dengan menjelaskan apa '1,3d', +4, et.c. cara? Pertanyaannya adalah untuk n baris, tetapi Anda tidak memberi tahu apa n itu (seperti n ternyata adalah 2 dalam contoh Anda, meskipun tidak jelas bagi noob apa yang harus diubah untuk mengubah n)
Robin Manoli
3
Ini menggunakan file temp jadi tidak terlalu berguna untuk ruang disk util 100%. Akan menarik untuk memiliki solusi yang melakukan ini secara harfiah "di tempat".
Shai
10

sed -i '1,3d' file.txt

Ini menghapus 3 baris pertama dari file.txt.

alhelal
sumber
6

Jika garis tabulasi adalah yang memiliki karakter tab:

grep '␉' <input_file >output_file

( menjadi karakter tab literal) atau setara

sed -n '/␉/p' <input_file >output_file

Dalam skrip bash / ksh / zsh, Anda dapat menulis $'\t'untuk sebuah tab, misalnya grep $'\t'atau sed -n $'/\t/p'.

Jika Anda ingin menghilangkan 10 baris di awal file:

tail -n +11 <input_file >output_file

(perhatikan bahwa itu +11untuk menghilangkan 10 garis, karena +11berarti "mulai dari garis 11" dan garis angka ekor dari 1) atau

sed '1,10d' <input_file >output_file

Di Linux, Anda dapat memanfaatkan -iopsi sed GNU untuk memodifikasi file yang ada:

sed -i -n '/\t/p' *.txt

Atau Anda dapat menggunakan shell loop dan file sementara:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

Atau jika Anda tidak ingin memodifikasi file di tempat, tetapi beri mereka nama yang berbeda:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
Gilles
sumber
3
"tabulated" biasanya berarti "cukup dicetak dalam tabel", bukan "indentasi dengan karakter tab".
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams saya tahu. Tabel yang tercetak cantik terkadang menggunakan karakter tab, yang lebih mudah dikenali daripada kolom yang disejajarkan. Tentu saja, jika Paul memberikan input sampel, saya bisa memberikan pencocokan yang lebih baik.
Gilles
2

Anda dapat menggunakan Vim dalam mode Ex:

ex -sc '1d5|x' file
  1. 1 pindah ke baris pertama

  2. 5 pilih 5 baris

  3. d menghapus

  4. x Simpan dan tutup

Steven Penny
sumber
0

gema "a \ nb" | sed '1d' # menghapus baris pertama

cat list.txt | sed '1d'> list.csv # baca list.txt dan tulis list.csv tanpa baris pertama

Perintah lain yang bermanfaat:

grep '^ |' # menemukan karakter pertama (pipa |)

sed 's / | // g' # menghapus pipa

sed 's / // g' # menghapus spasi

Samran Elahi
sumber
0

Dengan persentase

Menggunakan bash, untuk membersihkan file menggunakan angka persentase dan bukan jumlah baris absolut:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

Hati-hati karena perintah itu dapat merusak karena menghapus konten di tempat, tanpa membuat salinan.

Ini menghapus 75% baris pertama dari file yang disebutkan.

pgr
sumber