Tôi biết lệnh seq
tạo chuỗi số nguyên, mỗi số một dòng, nhưng tôi muốn hỏi hai câu hỏi:
Có thể viết các số của dãy trong cùng một dòng không?
Có thể tạo một chuỗi làm bằng chuỗi các số được phân tách bằng khoảng trắng không?
Tôi biết lệnh seq
tạo chuỗi số nguyên, mỗi số một dòng, nhưng tôi muốn hỏi hai câu hỏi:
Có thể viết các số của dãy trong cùng một dòng không?
Có thể tạo một chuỗi làm bằng chuỗi các số được phân tách bằng khoảng trắng không?
Câu trả lời:
Với bash
, zsh
và ksh93
, bạn có thể sử dụng biểu mẫu mở rộng dấu ngoặc kép {start..end..step} :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Di động đến tất cả hệ vỏ và bất kỳ hệ thống nào có seq (vì câu hỏi này được gắn thẻ)
Nếu bắt đầu là 1:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
Nếu không thì:
$ echo $(seq 5 10)
5 6 7 8 9 10
Với bc:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
Trong bash
echo {1..10}
Giải pháp echo này hoạt động nếu giá trị của IFS chứa một dòng mới, theo mặc định.
Theo mặc định, IFS được đặt thành chuỗi <dấu cách> <tab> <dòng mới> . Và được thiết lập lại cho mỗi lần khởi động sạch của vỏ. Nhưng, nếu bạn có bất kỳ lo ngại rằng nó có thể đã thay đổi trong một số trường hợp góc cực đoan, chúng tôi có một số giải pháp.
Trong bash, zsh, ksh chỉ cần sử dụng: IFS = $ '\ t \ n' (bỏ qua tất cả phần còn lại của câu trả lời này).
Tuy nhiên, việc đặt lại giá trị của IFS theo sh có thể phức tạp Đọc chi tiết đầy đủ ở đây .
$ unset IFS; echo $(seq 5 10) #Always work.
sẽ luôn làm việc Với điều kiện là sẽ không có mã bên dưới (hoặc tập lệnh con) cần IFS được đặt, chẳng hạn như tập lệnh nào OldIFS="$IFS"
.
Sử dụng một mẹo cho sh:
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
IFS='<space><tab><newline>'
nơi những <space>
, <tab>
, <newline>
là các ký tự chữ tương ứng.
seq 10 |xargs
...hoặc là...
seq 10 |paste -s -
Cả hai lệnh trên sẽ phân tách các số nguyên bằng khoảng trắng. xargs
mặc định để bắt chước /bin/echo
và do đó mỗi số nguyên được phân tách bằng một khoảng trắng. Mặc dù vậy, nó sẽ mặc định có độ dài dòng lệnh tối đa là 128K. Bạn có thể điều chỉnh ...
seq 100000 | xargs -s2093009 | wc -l
... bản in 1. Tôi giá trị -s
ở đây không phải là tùy ý - Tôi đã nhận được nó sau khi thử giá trị cao hơn (dù rõ ràng vẫn hoạt động) nhưng sau đó đã xargs
in thông báo hữu ích:
-s value should be <2093010
paste
là một trong hai (theo hiểu biết của tôi) các tiện ích bị xử phạt POSIX để xử lý các dòng có độ dài tùy ý:
paste
sử dụng ứng dụng đặc điểm kỹ thuật :Hầu hết các tiện ích tiêu chuẩn làm việc trên các tập tin văn bản . Các
cut
tiện ích có thể được sử dụng để chuyển các tập tin với độ dài dòng tùy ý vào một tập hợp các tập tin văn bản có chứa cùng một dữ liệu. Cácpaste
tiện ích có thể được sử dụng để tạo ra các file với độ dài dòng tùy ý (hoặc tái tạo).Một tệp chứa các ký tự được tổ chức thành không hoặc nhiều dòng. Các dòng không chứa các ký tự NUL và không có ký tự nào có thể vượt quá
{LINE_MAX}
độ dài byte, bao gồm cả\n
ký tự ewline. Mặc dù POSIX.1-2008 không phân biệt giữa tệp văn bản và tệp nhị phân (xem tiêu chuẩn ISO C) , nhiều tiện ích chỉ tạo ra đầu ra có thể dự đoán hoặc có ý nghĩa khi hoạt động trên tệp văn bản. Các tiện ích tiêu chuẩn có các hạn chế như vậy luôn chỉ định các tệp văn bản trong các phần STDIN hoặc INPUT FILES của chúng .
paste
mặc định cho một dấu phân cách tab và do đó sẽ có một tab giữa mỗi số nguyên theo lệnh thứ hai. Bạn có thể...
seq 10 |paste -sd ' ' -
... sử dụng công -d
cụ loại bỏ để thay đổi hành vi đó,
seq 10 | xargs
hoạt động tốt, nhưng vì giới hạn dòng lệnh, seq 100000 | xargs
xuất ra 5 \n
dòng phân cách (trên hệ thống của tôi)
paste and
cut` là hai tiện ích bị xử phạt POSIX để làm việc với các dòng có độ dài tùy ý. Điều đó nói rằng, xargs | xargs
là một lựa chọn. Hoặc cách khácseq 100000|tr \\n \
$IFS
một số? Và bash
dù sao thì nó cũng chậm chạp. Trong câu trả lời của bạn, bạn nói về sh
- bạn thậm chí không cần phải đặt $IFS
trong bối cảnh đó - nó sẽ được truyền qua môi trường nếu nó được đặt ở đó. Và nó không ngắn hơn so với seq 100000|paste -s
nhịp đập hiệu suất 5: 1. Và paste
không đến với bất kỳ vấn đề nào.
$IFS
- tôi sử dụng nó mọi lúc - nhưng tôi không sử dụng nó trừ khi tôi đặt nó và bạn cũng không nên. Đặc biệt, bạn không nên giới thiệu cho những người lạ ngẫu nhiên không biết thay thế tốt hơn nên làm như vậy. Đừng để nó có cơ hội - đó là một chương trình máy tính. Đó là một lỗi nếu nó hoạt động bất ngờ - tại sao cho phép nó có thể?
echo $(seq 1 10)