Tôi phải đặt biến bash vào dòng đầu tiên của tệp. Tôi đoán nó là với lệnh grep, nhưng nó là bất kỳ cách nào để hạn chế số lượng các dòng?Cách lấy dòng đầu tiên của tệp trong tập lệnh bash?
Trả lời
head
mất những dòng đầu tiên từ một tập tin, và các thông số -n
có thể được dùng để xác định có bao nhiêu dòng nên được trích xuất:
line=$(head -n 1 filename)
line=$(head -1 file)
sẽ hoạt động tốt. (Như câu trả lời trước). Nhưng
line=$(read -r FIRSTLINE < filename)
sẽ nhanh hơn một chút là read
là lệnh bash được cài sẵn.
Phương pháp thứ hai không hoạt động như được viết , bởi vì 'read' không in bất cứ thứ gì (vì vậy' line' gió lên trống), và cũng thực thi trong một subshell (vì vậy 'FIRSTLINE' được đặt thành dòng đầu tiên, nhưng chỉ trong subshell, vì vậy nó không có sẵn sau đó) .Giải pháp: chỉ sử dụng 'read -r line
để đọc dòng đầu tiên bằng bash, sử dụng câu lệnh read
. ví dụ
read -r firstline<file
firstline
sẽ biến của bạn (Không cần phải gán cho khác)
thử với' cat ... | đọc -r VAR' và nó không thành công: ( – sorin
Làm thế nào để bạn đọc dòng thứ hai? – qed
@sorin, 'cat ... | đọc VAR' sẽ thất bại trong hầu hết các shell (tất cả ngoại trừ' zsh' theo như tôi biết) bởi vì Mỗi thành phần trong một đường ống sẽ chạy trong các subshells riêng biệt, có nghĩa là '$ VAR' sẽ được đặt trong subshell (không còn tồn tại ngay khi đường dẫn đã hoàn thành) thay vì trong shell gọi. với 'read VAR << EOF \ n $ (cat ...) \ nEOF' (trong đó mỗi' \ n' là một dòng mới) – zrajm
này cũng đủ và lưu trữ các dòng đầu tiên của filename
trong biến $line
:
read -r line < filename
Tôi cũng thích awk
cho điều này:
awk 'NR==1 {print; exit}' file
Để lưu trữ chính dòng đó, hãy sử dụng cú pháp var=$(command)
. Trong trường hợp này, line=$(awk 'NR==1 {print; exit}' file)
.
Hoặc thậm chí sed
:
sed -n '1p' file
Với tương đương line=$(sed -n '1p' file)
.
Xem một mẫu khi chúng ta ăn read
với seq 10
, có nghĩa là, một chuỗi các con số từ 1 đến 10:
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
'sed' 1! D; q'' (hoặc' sed -n '1p; q'') sẽ bắt chước ký tự' awk' logi của bạn c và ngăn chặn đọc thêm vào tệp. Vì chúng ta chỉ muốn dòng đầu tiên, chúng ta có thể thay thế bằng 'sed q' hoặc 'awk' 1; {exit} '' hoặc thậm chí 'grep -m1 ^' (ít mã, cùng một logic cần thiết). (Đây không phải là câu trả lời cho cuộc điều tra downvote.) –
@AdamKatz đó là một cách rất hay, cảm ơn! Tôi tìm thấy một với 'grep' rất thông minh. Tất nhiên chúng ta cũng có thể nói 'head -n 1 file'. – fedorqui
Có, 'head -n1' sẽ nhanh hơn (nhị phân nhỏ hơn để tải) và' read' sẽ nhanh nhất (không có nhị phân để tải, đó là một nội trang). Tôi đặc biệt thích 'grep -m1 --color .' khi tôi chỉ in dòng đầu tiên bởi vì nó sẽ tô màu cho đường thẳng, làm cho nó tuyệt vời cho các tiêu đề bảng. –
Câu hỏi không hỏi đó là nhanh nhất, nhưng để thêm cho câu trả lời sed, -n '1p' hoạt động kém vì không gian mẫu vẫn được quét trên các tệp lớn. Ra khỏi tò mò tôi thấy rằng 'đầu' thắng trên sed trong gang tấc:
# best:
head -n1 $bigfile >/dev/null
# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null
# VERY slow:
sed -n '1p' $bigfile >/dev/null
Chỉ echo
danh sách đầu tiên của file gốc của bạn vào tập tin mục tiêu của bạn.
echo $(head -n 1 source.txt) > target.txt
Trong đó 'head -n 1 source.txt> target.txt' sẽ thực hiện chính xác như nhau. – YoYo
- 1. Cách lấy mười byte đầu tiên của tệp nhị phân
- 2. Cách lấy đầu ra của lệnh bash trong biến
- 3. Bash: Lấy đối số dòng lệnh đầu tiên và vượt qua phần còn lại
- 4. Cách lấy chữ cái đầu tiên trong biến Bash?
- 5. Đọc các dòng bắt đầu từ một số dòng trong tập lệnh bash
- 6. giải nén dòng đầu tiên từ tệp bằng lệnh awk
- 7. bash thay thế ký tự đầu tiên trong mỗi dòng
- 8. Tệp nguồn trong tập lệnh bash
- 9. Thay dòng đầu tiên của tệp văn bản trong Java
- 10. Trình thông dịch lệnh của Windows: cách lấy mã thoát của lệnh đường ống đầu tiên
- 11. Chạy tập lệnh Bash trên dòng lệnh Windows XP
- 12. Cách lấy tên bí danh gọi tập lệnh bash
- 13. Xử lý tất cả các đối số ngoại trừ đoạn đầu tiên (trong tập lệnh bash)
- 14. Cách lấy dòng văn bản đầu tiên của tệp Matlab M?
- 15. Nối các tệp văn bản với dòng lệnh của Windows, thả các dòng đầu tiên
- 16. dòng lệnh exec từ tập tin trong bash
- 17. Cách đọc dòng đầu tiên của một tệp
- 18. Đọc dòng đầu tiên của một tệp trong Ruby
- 19. Lấy các dòng đầu tiên của Bài viết
- 20. Cách bao gồm tệp trong tập lệnh bash shell
- 21. Cách lấy n ký tự đầu tiên của một biến trong Bash?
- 22. Dòng lệnh Python 'dòng đầu vào tập tin'
- 23. Remove ký tự đầu tiên của một chuỗi trong Bash
- 24. Lô (.bat): lấy tên của tập lệnh đầu tiên, không phải là tên hiện tại
- 25. Dòng đầu tiên của tập lệnh thử nghiệm Perl (.t) là gì?
- 26. Cách bỏ qua dòng đầu tiên khi fscanning tệp .txt?
- 27. tên tệp và số dòng của tập lệnh python
- 28. Lệnh batch của Windows để đọc dòng đầu tiên từ tệp văn bản
- 29. Đầu ra lệnh của kịch bản lệnh Bash vào biến
- 30. Xóa các dòng X đầu tiên khỏi một tệp PHP
Chi phí cao hơn đáng kể so với phương pháp 'đọc'. '$()' tắt một nhánh con và sử dụng lệnh bên ngoài (* bất kỳ * lệnh bên ngoài) có nghĩa là bạn đang gọi 'execve()', gọi trình liên kết và trình tải (nếu nó sử dụng thư viện dùng chung, thường là trường hợp), v.v. –
Nó thậm chí có thể ngắn hơn: 'line =" $ (đầu -1 FILENAME) "' – nikolay
Và cũng: 'line = \' head -1 FILENAME \ '' –