我正在使用 bash (CentOS 5) 并希望生成此输出(我假设我可以使用seq
或echo
一起使用?):
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