私は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
、私私は仮定しています)。
以下はそれを行う必要があります:
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
私のひねり:
純粋なawk
awk 'BEGIN{for(;n<31;)print ++n"|"n","}'
printf
+ xargs
printf '%s\n' {0..31} | xargs -I {} echo "{}|{},"
repeat
zsh
のループ
n=0; repeat 32 echo "$n|$((n++)),"
seq 100|sed 's/.*/&|&,/'
...うまくやるべきです...
シェルだけで:
i=-1 x=31
while [ "$i" -lt "$x" ]
do echo "$((i+=1))|$i,"
done
そしてpaste
を楽しむために:
paste -d'|,' <(seq 31) <(seq 31) /dev/null
最も単純な解決策(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
いくつかの複雑なもの:
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
は標準コマンドではないことに注意してください。おそらく、シーケンスに数値を出力する場合、最適なツールはawk
とbc
です。 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
Perlを使用すると、単一のプロセスでseq
ループとprint
フォーマットの両方を実行できます。
Perl -e 'for (1..31) {print "$_|$_,\n"}'
「コマンドラインから」の部分に厳密に答えるわけではありませんが、リストを手動で入力したと言っているので、次のように提示させてください。簡単で高速な方法を使用してリストを入力する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
私はseq
、tr
、echo
に精通しており、投稿された他のさまざまな回答を理解しています。実際にテキスト生成をスクリプトする必要がない限り、このジョブに最適なツールはvim
であると私は考えています。