1行に1つずつ整数シーケンスを生成するコマンドを知っていますが、2seq
つの質問をしたいと思います。
同じ行にシーケンス番号を書くことは可能ですか?
スペースで区切られた一連の数字からなる文字列を生成できますか?
答え1
bash
、zsh
、 でksh93
使用できます。{start..end..step}中括弧拡張フォーム:
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
答え2
GNUはseq
区切り文字(-s
)オプションを使用します。
$ seq -s ' ' 1 5
1 2 3 4 5
$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
答え3
seqを持つすべてのシェルとすべてのシステムに移植可能(この質問にタグが付けられているため)
開始値が1の場合:
$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10
それ以外の場合:
$ echo $(seq 5 10)
5 6 7 8 9 10
BCの場合:
$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)
バッシュから
echo {1..10}
メモ:
このエコーソリューションは、IFS値に改行文字(デフォルト)が含まれている場合に機能します。
デフォルトでは、IFSはシーケンスに設定されます。<スペース> <タブ> <改行>。シェルがクリーンブートされるたびにリセットされます。ただし、極端な状況で変更される可能性があるという懸念がある場合は、いくつかの回避策があります。
bash、zsh、kshではIFS = $ '\ t \ n'(この回答の残りの部分はすべてスキップ)を使用してください。
ただし、shでIFS値をリセットするのは複雑な場合があります。ここで詳細を読んでください。。
IFSの設定を解除します。
$ unset IFS; echo $(seq 5 10) #Always work.
常に動作します。前提は、以下にIFSを設定する必要があるコード(または添字)がないことです。たとえばOldIFS="$IFS"
。
正しい解決策。
使ういたずらshの場合:
sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd' # correct.
答え4
seq 10 |xargs
...または...
seq 10 |paste -s -
上記の両方のコマンドは、整数をスペースで区切ります。xargs
デフォルトはエミュレートするため、/bin/echo
各整数はスペースで区切られます。ただし、デフォルトの最大コマンドライン長は128Kです。これを調整できます...
seq 100000 | xargs -s2093009 | wc -l
...prints 1.ここで私の値は-s
ランダムではありません。より高い値を試した後に得た。(これはとにかく動作するようです)ただし、次のxargs
便利なメッセージが印刷されます。
-s value should be <2093010
paste
どちらか(私の知る限り)任意の長さの行を処理するためのPOSIX承認ユーティリティ:
ほとんどの標準ユーティリティは以下に適しています。テキストファイル。この
cut
ユーティリティは、任意の行長のファイルを同じデータを含むテキストファイルセットに変換するために使用できます。このpaste
ユーティリティは、任意の行長でファイルを生成(または再生成)するために使用できます。ゼロ行以上の文字を含むファイル。この行にはNUL文字が含まれておらず、次を超えることはできません。
{LINE_MAX}
改行文字を含む長さ(バイト)です\n
。 POSIX.1-2008はテキストファイルとバイナリファイルを区別しませんが、(ISO C規格参照)、多くのユーティリティは、テキストファイルを操作するときにのみ予測可能または意味のある出力を生成します。これらの制限がある標準ユーティリティは、常に次のように指定します。テキストファイル彼ら標準入力または入力ファイル部分。
paste
デフォルトはタブ区切り文字なので、2 番目のコマンドの後の各整数の間にタブがあります。あなたはできます...
seq 10 |paste -sd ' ' -
...-d
この動作を変更するには、区切り記号スイッチを使用してください。