Bash-同じ行の数字のシーケンス


20

seq整数のシーケンスを1行に1つずつ生成するコマンドを知っていますが、2つの質問をしたいと思います。

  1. 同じ行にシーケンスの番号を書くことは可能ですか?

  2. 空白で区切られた数字のシーケンスで構成される文字列を作成することは可能ですか?


シェルは、改行をスペースのように引数区切り文字として扱います。そのため、seqにはセパレーター引数がありますが、もっと簡単なことはただecho $(seq 1 10)
-user3188445

1
@ user3188445、それはそれを行うsplit + glob演算子です(デフォルトではスペースと改行を含むが変更可能なIFS特殊変数を使用します)、それはシェルによって行われるトークン化という単語とは別です。
ステファンシャゼル

回答:



21

GNU seqはセパレーター(-s)オプションを取ります:

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5

1
echo $(seq 5)正常に動作します。

13

すべてのシェルおよびseqを持つシステムに移植可能(この質問にはタグが付けられているため)

startが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はシーケンス<space> <tab> <newline>に設定されます。そして、シェルのクリーンスタートごとにリセットされます。ただし、極端な場合に変更される可能性があるという懸念がある場合は、いくつかの解決策があります。

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.

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
テルドン

1
ほとんどのsh実装は、環境で見つかったIFSを無視します(例外は、いくつかの灰派生物、Bourneシェルの非常に古いバージョン、poshの最近のバージョンです)。IFS='<space><tab><newline>' これらの、、が対応するリテラル文字である<space>場合<tab>、単純に実行できることに注意してください<newline>
ステファンシャゼル


0
seq 10 |xargs

...または...

seq 10 |paste -s -

上記の両方のコマンドは、整数を空白で区切ります。xargsデフォルトは模倣/bin/echoであるため、各整数は単一のスペースで区切られます。ただし、コマンドラインの最大長は128Kにデフォルト設定されます。これを調整できます...

seq 100000 | xargs -s2093009 | wc -l

... prints 1. -sここの値はarbitrary意的ではありません-より高い値を試してみたところ(どうやらうまくいったようですが)、後でxargs役に立つメッセージを出力しました:

-s value should be <2093010

pasteは、任意の長さの行を処理するための2つの(私の知る限り) POSIX認定ユーティリティの1つです。

paste仕様アプリケーションの使用法

ほとんどの標準ユーティリティはテキストファイルで機能します。このcutユーティリティを使用すると、任意の行長のファイルを同じデータを含むテキストファイルのセットに変換できます。このpasteユーティリティを使用して、任意の行長のファイルを作成(または再作成)できます。

テキストファイル

0個以上の行に編成された文字を含むファイル。行にはNUL文字は含まれず{LINE_MAX}\newline文字を含む長さのバイトを超えることはできません。POSIX.1-2008はテキストファイルとバイナリファイルを区別しませんが(ISO C標準を参照)、多くのユーティリティは、テキストファイルを操作するときに予測可能または意味のある出力のみを生成します。このような制限がある標準ユーティリティは、常にSTDINまたはINPUT FILESセクションでテキストファイルを指定します

pasteデフォルトはタブ区切り文字であるため、2番目のコマンドに続く各整数の間にタブがあります。あなたはできる...

seq 10 |paste -sd ' ' - 

... -dその動作を変更するには、elimiterスイッチを使用し、


seq 10 | xargsは正常に動作しますが、コマンドラインの制限のため、seq 100000 | xargs5つの\n区切り行を出力します(私のシステム上)
Peter.O

@ Peter.O-cut` paste and は、任意の長さの行を操作するための2つのPOSIX公認ユーティリティです。とxargs | xargsはいえ、オプションです。または、seq 100000|tr \\n \
mikeserv

コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
テルドン

@BinaryZebra-いいえ、そうではありません。$IFS数字に設定してみませんか?そして、でbashそのgodawful遅いとにかく。あなたの答えであなたが話すsh-あなたは$IFSそのコンテキストで設定する必要さえありません-それがそこに設定されている場合、環境を介して渡されます。そして、seq 100000|paste -sパフォーマンスの面で5:1に勝るほど短くはありません。そしてpaste、何の落とし穴もありません。
mikeserv

@BinaryZebra-さあ、なぜ嘘をつくの?間違った情報を広めることを楽しんでいるので、このサイトにかなりの回答プロファイルがありますか?それとも、私は人々を助けることが好きで、私がそうしている間に学習の課題を楽しんでいるからでしょうか?どちらがもっともらしいと思いますか?私は好きです$IFS-私はいつもそれを使用します-しかし、私はそれ設定し、あなたもそうするべきでない限り、それを使用しません。特に、あなたはそれを行うべきより良い方法を知らない見知らぬ人をランダムに推薦するべきではありません。それを偶然に任せないでください-それはコンピュータプログラムです。それが予期しない動作をする場合、それはバグです。
mikeserv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.