web-dev-qa-db-ja.com

「|」で区切られた2つの数字のシーケンスを生成します

私はbash(CentOS 5)を使用していて、この出力を生成しようとしています(seqまたはechoを一緒に使用できると思いますか?):

1|1,
2|2,
3|3,
....
31|31,
32|32,
33|33,

seqの例を2時間以上グーグルで検索しましたが、最も近いものは次のとおりです。

echo {1..31}..{1..31} | tr ' ' '\n'

これはほとんど私が欲しいものを私に与えますが、私が..を|に変更すると混乱しますまたは「|」)。

私が必要とする2番目の数値世代は同じ方法でフォーマットされていますが、年の降順です。

2015|2015,
2014|2014,
...
1938|1938,
1937|1937,
1936|1936,

私はすでにこれらの2つのリストを手動で入力しましたが、将来のニーズと学習のためにコマンドラインからこれを行う方法についての入力が欲しいです(seqまたはecho、私私は仮定しています)。

6
James Gaul

以下はそれを行う必要があります:

seq 0 31 | awk '{ print $1"|"$1", " }'

降順の場合:

seq 31 -1 0 | awk '{ print $1"|"$1", " }'

これらはawkを使用して、パイプ文字で区切られた各行の番号を複製します。

または純粋なbashを使用する(コメントでDopeGhotiによって提案されているように):

for n in {0..31}; do printf "%d|%d,\n" $n $n; done
for n in {31..0}; do printf "%d|%d,\n" $n $n; done
9
dhag

私のひねり:

  • 純粋なawk

    awk 'BEGIN{for(;n<31;)print ++n"|"n","}'
    
  • printf + xargs

    printf '%s\n' {0..31} | xargs -I {} echo "{}|{},"
    
  • repeatzshのループ

    n=0; repeat 32 echo "$n|$((n++)),"
    
10
jimmij
seq 100|sed 's/.*/&|&,/'

...うまくやるべきです...

シェルだけで:

i=-1 x=31
while [ "$i" -lt "$x" ]
do    echo "$((i+=1))|$i,"
done
7
mikeserv

そしてpasteを楽しむために:

paste -d'|,' <(seq 31) <(seq 31) /dev/null
7
Costas

最も単純な解決策(ksh93、bash、zsh):

printf '%s|%s,\n' {1..31}{,}             ### Ascending  sequence.
printf '%s|%s,\n' {2015..1936}{,}        ### Descending sequence.

または、ループを使用する必要がある場合:

i=0 x=31
while    (( i++ < x ))
do       echo "$i|$i,"
done
6
user79743

いくつかの複雑なもの:

seq  -f %.0f 0.9 0.5 33.8 | paste -d '|,\n' - - /dev/null
seq  -f %.0f 2015.1 -0.5 1935.2 | paste -sd '|,\n' - - /dev/null

seqは標準コマンドではないことに注意してください。おそらく、シーケンスに数値を出力する場合、最適なツールはawkbcです。 bcは任意精度の演算を実行できますが、出力のフォーマットに関しては非常に制限されているため、ここではawkがより明白な解決策です。

awk 'BEGIN{for(i=1;i<=33;i++) print i "|" i ","}'

bcは次のように使用できますが、

echo 'for (i=1;i<=33;i++) {i;i}' | bc | paste -d '|,\n' - - /dev/null
5

Perlを使用すると、単一のプロセスでseqループとprintフォーマットの両方を実行できます。

Perl -e 'for (1..31) {print "$_|$_,\n"}'
3
arielf

「コマンドラインから」の部分に厳密に答えるわけではありませんが、リストを手動で入力したと言っているので、次のように提示させてください。簡単で高速な方法を使用してリストを入力するvim


ロングバージョン

コマンドラインでvimと入力して、vimを開きます。

iを押して挿入モードに入ります。最初の行を入力します:1|1,そして<Esc>を押して挿入モードを終了します。

qを押してマクロの記録を開始し、xを(任意に)押してマクロをレジスタ「x」に記録します。

yyと入力して現在の行をコピーし、pと入力して貼り付けます。これにより、新しく貼り付けた行の先頭にもカーソルが置かれます。次に、<C-a>(Control-A)と入力して、カーソルの下の数字をインクリメントします。

t,と入力して、カーソルを次のカンマの直前に移動します(これにより、カーソルは行の2番目の数字に配置されます)。もう一度<C-a>と入力して、この番号もインクリメントします。

qと入力して、マクロの記録を停止します。

あとは、マクロを何度でも再生するだけです。デモのためだけに15と言います。 15@xと入力すると、マクロが15回再生されるため、画面に1から17までのリストが表示されます。さらに行が必要な場合は、たとえば500@xと入力するだけです。

行数が多すぎる場合は、文字kを入力してファイル内を上に移動し、jを入力して下に移動します。削除する最初の行にいるときに、dGと入力すると、そこからファイルの最後まで削除できます。


ショートバージョン

1から31までのリストを生成するには、コマンドプロンプトでvim<Enter>と入力してvimを開き、次のキーを押します。

i1|1,<Esc>qxyyp<C-a>t,<C-a>q29@x


私はseqtrechoに精通しており、投稿された他のさまざまな回答を理解しています。実際にテキスト生成をスクリプトする必要がない限り、このジョブに最適なツールはvimであると私は考えています。

2
Wildcard