Làm cách nào để xóa n dòng đầu tiên của tệp ascii bằng lệnh shell?


92

Tôi có nhiều tệp chứa thông tin văn bản ascii trong 5-10 dòng đầu tiên, theo sau là thông tin ma trận được lập bảng tốt. Trong tập lệnh shell, tôi muốn xóa một vài dòng văn bản đầu tiên này để tôi có thể sử dụng thông tin ma trận thuần túy trong một chương trình khác. Làm thế nào tôi có thể sử dụng các lệnh bash shell để làm điều này?

Nếu có ích gì, tôi đang sử dụng RedHat và hệ thống linux Ubuntu.

Câu trả lời:


143

Miễn là tệp không phải là symlink hoặc hardlink, bạn có thể sử dụng sed, tail hoặc awk. Ví dụ dưới đây.

$ cat t.txt
12
34
56
78
90

quyến rũ

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

Bạn cũng có thể sử dụng sed tại chỗ mà không cần tệp tạm thời : sed -i -e 1,3d yourfile. Điều này sẽ không lặp lại bất cứ điều gì, nó sẽ chỉ sửa đổi các tập tin tại chỗ. Nếu bạn không cần chuyển kết quả sang lệnh khác, việc này sẽ dễ dàng hơn.

đuôi

$ tail -n +4 t.txt
78
90

ôi

$ awk 'NR > 3 { print }' < t.txt
78
90

8
Bạn cũng có thể sử dụng sed tại chỗ mà không cần tệp tạm thời : sed -i -e 1,3d yourfile. Điều này sẽ không lặp lại bất cứ điều gì, nó sẽ chỉ sửa đổi các tập tin tại chỗ. Nếu bạn không cần chuyển kết quả sang lệnh khác, việc này sẽ dễ dàng hơn.
Yanick Girouard

1
Cảm ơn @YanickGirouard, @IgnacioVazquezAbrams! Hai bạn vừa tiết kiệm cho tôi một tấn lao động thủ công trong nghiên cứu của tôi! :)
Paul

2
@Svetlana sed -iđặc biệt. Hầu hết các triển khai chỉ xóa tệp và thay thế nó bằng một tệp mới, không hoạt động đối với các liên kết vì cuối cùng bạn để lại bản gốc ở vị trí khác.
jw013

6
làm thế nào về việc giải thích những gì '1,3d', +4, et.c. có nghĩa? Câu hỏi dành cho n dòng, nhưng bạn không cho biết n là gì (vì rõ ràng n là 2 trong ví dụ của bạn, mặc dù không rõ ràng về việc thay đổi thứ gì để thay đổi n)
Robin Manoli

3
Điều này sử dụng tệp tạm thời nên không hữu ích cho không gian đĩa sử dụng 100%. Sẽ rất thú vị khi có một giải pháp thực hiện điều này theo nghĩa đen là "tại chỗ".
Shai

10

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

Điều này xóa 3 dòng đầu tiên từ file.txt.


6

Nếu các dòng được lập bảng là những dòng có ký tự tab:

grep '␉' <input_file >output_file

( là một ký tự tab theo nghĩa đen) hoặc tương đương

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

Trong tập lệnh bash / ksh / zsh, bạn có thể viết $'\t'cho một tab, ví dụ grep $'\t'hoặc sed -n $'/\t/p'.

Nếu bạn muốn loại bỏ 10 dòng ở đầu tệp:

tail -n +11 <input_file >output_file

(lưu ý rằng +11cần loại bỏ 10 dòng, vì +11có nghĩa là bắt đầu từ dòng 11 số và các dòng số đuôi từ 1) hoặc

sed '1,10d' <input_file >output_file

Trên Linux, bạn có thể tận dụng -itùy chọn của GNU sed để sửa đổi các tệp tại chỗ:

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

Hoặc bạn có thể sử dụng vòng lặp shell và các tệp tạm thời:

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

Hoặc nếu bạn không muốn sửa đổi các tệp tại chỗ, nhưng thay vào đó hãy đặt cho chúng một tên khác:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done

3
"Được lập bảng" thường có nghĩa là "được in đẹp trong bảng", không phải "thụt vào bằng các ký tự tab".
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams tôi biết. Bảng được in đẹp đôi khi sử dụng các ký tự tab, dễ phát hiện hơn các cột được căn chỉnh. Tất nhiên, nếu Paul đưa ra một đầu vào mẫu, tôi có thể đưa ra một công cụ đối sánh tốt hơn.
Gilles

2

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -sc '1d5|x' file
  1. 1 di chuyển đến dòng đầu tiên

  2. 5 chọn 5 dòng

  3. d xóa bỏ

  4. x lưu và đóng


0

tiếng vang "a \ nb" | sed '1d' # xóa dòng đầu tiên

mèo list.txt | sed '1d'> list.csv # đọc list.txt và viết list.csv không có dòng đầu tiên

Các lệnh hữu ích khác:

grep '^ |' # tìm ký tự đầu tiên (pipe |)

sed 's / | // g' # xóa đường ống

sed 's / // g' # xóa không gian


0

Theo tỷ lệ phần trăm

Sử dụng bash, để dọn sạch tệp bằng số phần trăm thay vì số dòng tuyệt đối:

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

Coi chừng vì lệnh đó có thể bị phá hủy vì nó xóa nội dung tại chỗ, mà không tạo bản sao.

Nó xóa 75% dòng đầu tiên khỏi tệp được đề cập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.