生成两个由“|”分隔的数字序列

Jam*_*aul 7 command-line shell text-processing seq

我正在使用 bash (CentOS 5) 并希望生成此输出(我假设我可以使用seqecho一起使用?):

1|1,
2|2,
3|3,
....
31|31,
32|32,
33|33,
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索seq了两个多小时的例子,我能想到的最接近的是:

echo {1..31}..{1..31} | tr ' ' '\n'
Run Code Online (Sandbox Code Playgroud)

这几乎给了我我想要的东西,但是当我将 .. 更改为 | 甚至“|”)。

我需要的第二代数字以相同的方式格式化,但对于降序年份,即:

2015|2015,
2014|2014,
...
1938|1938,
1937|1937,
1936|1936,
Run Code Online (Sandbox Code Playgroud)

我已经手动输入了这两个列表,但我希望能提供有关如何从命令行完成此操作以供将来需要和学习(seqecho,我假设)的任何输入。

dha*_*hag 10

以下应该这样做:

seq 0 31 | awk '{ print $1"|"$1", " }'
Run Code Online (Sandbox Code Playgroud)

在降序情况下:

seq 31 -1 0 | awk '{ print $1"|"$1", " }'
Run Code Online (Sandbox Code Playgroud)

这些使用 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么分叉出两个二进制文件?`for i in {0..31}; 做 echo "$i|$i,"; 完成`。 (4认同)
  • @DopeGhoti - 为什么 * 不 * 分叉两个 *tiny* 二进制文件 * 比缓慢的单片 shell *快得多* - 只能使用 *two* for 循环来完成 - 一个在内部生成集合,第二个然后在脚本中迭代它。`for ... {num..num}` 是做任何事情的丑陋方式。 (3认同)

jim*_*mij 10

我的曲折:


mik*_*erv 7

seq 100|sed 's/.*/&|&,/'
Run Code Online (Sandbox Code Playgroud)

……应该没问题……

只需一个外壳:

i=-1 x=31
while [ "$i" -lt "$x" ]
do    echo "$((i+=1))|$i,"
done
Run Code Online (Sandbox Code Playgroud)


Cos*_*tas 7

为了好玩paste

paste -d'|,' <(seq 31) <(seq 31) /dev/null
Run Code Online (Sandbox Code Playgroud)


小智 6

最简单的解决方案(在 ksh93、bash、zsh 中):

printf '%s|%s,\n' {1..31}{,}             ### Ascending  sequence.
printf '%s|%s,\n' {2015..1936}{,}        ### Descending sequence.
Run Code Online (Sandbox Code Playgroud)

或者,如果您必须使用循环:

i=0 x=31
while    (( i++ < x ))
do       echo "$i|$i,"
done
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

一些复杂的:

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
Run Code Online (Sandbox Code Playgroud)

请注意,这seq不是标准命令。POSIXly,如果你想打印一个数字序列,最好的工具是awkbcbc可以进行任意精度算术,但在格式化输出时非常有限,因此awk这里有一个更明显的解决方案。

awk 'BEGIN{for(i=1;i<=33;i++) print i "|" i ","}'
Run Code Online (Sandbox Code Playgroud)

虽然你可以使用bc像:

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