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

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

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

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

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

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

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

我需要的第二个数字生成的格式与递减年份的格式相同,即:

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

我已经手动输入了这两个列表,但我希望任何关于如何从命令行完成此操作的输入,以满足未来的需要和学习(seq或者echo,我假设)。

答案1

应该执行以下操作:

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

答案2

我的曲折:

  • 纯的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++)),"
    

答案3

seq 100|sed 's/.*/&|&,/'

……应该可以吧……

只有一个外壳:

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

答案4

最简单的解决方案(在 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

相关内容