Cách ngắn nhất dễ đọc nhất để in dòng thứ n của tệp là gì?


0

Đó là về Unix và Linux.

Có, có nhiều giải pháp cho vấn đề đó, ví dụ: xem http://mywiki.wooledge.org/BashFAQ/011 . Một số trong số chúng nhanh như địa ngục (không đọc toàn bộ tệp) và một số chậm nhưng ngắn và dễ đọc hơn nhiều. Tôi quan tâm đến một giải pháp hoạt động trên các tệp nhỏ <1MB, dễ nhớ và dễ đọc và nên hoàn thành dưới 1 giây. Tất nhiên tôi có thể viết một tập lệnh hoặc bí danh shell, nhưng khi tôi đến các máy tính được cài đặt mới, tôi phải thiết lập lại môi trường của mình trước, vì vậy tôi thích một giải pháp hoạt động với hầu hết Unix và Linux Distris, hoặc ít nhất là sau khi cài đặt các công cụ mong muốn thông qua quản lý gói. Ai đó có thể đánh bại điều này?:

 awk NR==42 file

Câu trả lời:


1

Cả hai awkperlcác giải pháp đều có nhược điểm là chúng tiếp tục đọc sau khi in dòng thứ N. Các yeslệnh trong đó in vô cùng nhiều dòng, có thể được sử dụng để kiểm tra điều này.

Một giải pháp ngắn chia sẻ vấn đề này là:

 sed -n 42p file

Cái này thoát ra sau khi in dòng:

sed -n '42{p;q}' file

Như đã nói hiệu suất không quan trọng lắm đối với tôi. Tôi nghĩ sed -n 42p filelà đối thủ duy nhất tôi đoán.
toán

Tôi nghĩ sed -n 42p filelà tốt hơn so với awk NR==42 filekhi sử dụng đoạn mã awk bạn phải nhớ ==NRNR cũng phải ở dạng chữ hoa. Đoạn trích sed thực sự gần với một lệnh lý tưởng : cmd -n 42 file. Bạn chỉ cần nhớ pđể in.
toán

2

Miễn là có lệnh đầu và đuôi

Điều này sẽ in dòng thứ 12 của tập tin abc. Giữ đuôi -n 1 và chỉ cần thay đổi 12 thành bất kỳ số dòng nào bạn muốn in.

$ đầu -n 12 abc | đuôi -n 1

Nếu bạn sẵn sàng cài đặt công cụ thông qua quản lý gói, thì bạn nên sẵn sàng sử dụng tập lệnh bạn viết, đồng thời, tôi đoán rằng có thể tất cả các bản phân phối linux và unix của bạn đều có lệnh head và tail. nhưng nếu không thì cài đặt chúng, hoặc cài đặt awk hoặc perl, tất nhiên mọi thứ bạn sử dụng sẽ hoạt động như nhau trên bất kỳ hệ thống nào, miễn là hệ thống có công cụ, có thể là đầu và đuôi, awk hoặc perl.


vâng, bạn thậm chí có thể cải thiện: head -42 file | tail -1nhưng điều này quá dài đối với tôi :)
toán học

@math vì bạn sẵn sàng viết một tập lệnh, bạn có thể rút ngắn bất kỳ lệnh nào chỉ còn $ dist 42 <ENTER> và nó có thể có dòng này hoặc dòng sed hoặc bất cứ điều gì, cho bất cứ điều gì mà bản phân phối linux của bạn chia sẻ .. đầu và đuôi có lẽ là rất phổ biến
barlop

0

Tôi không nghĩ rằng tôi có thể đánh bại ví dụ AWK của bạn để đơn giản hoặc dễ đọc, nhưng đây là một ví dụ về Perl

  perl -ne 'print if $. == 42' file

Không có gì có thể đánh bại Perl khi nói đến tính di động giữa các hệ thống và kiến ​​trúc. Chỉ cần giữ bí danh và .bashrc của bạn trong một kho lưu trữ trung tâm, git cloneđến các hệ thống mới.
grawity

0

sử dụng sed:

sed -n 42p file

Nó rất dễ gõ (không có chữ in hoa, không cần nhấn "Shitft") và rất ngắn.


1
ồ, tôi thấy đây là ví dụ đầu tiên trong Câu hỏi thường gặp mà bạn đã đề cập ...
user880480

0

Bạn có thể sử dụng sed . Trong lệnh sau, -ntùy chọn vô hiệu hóa in từng dòng, do đó chỉ thực hiện in ( plệnh) rõ ràng . 12phù hợp với dòng thứ 12 và p phát hành một bản in.

sed -n '12 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.