Jam*_*aul 7 command-line shell text-processing seq
我正在使用 bash (CentOS 5) 并希望生成此输出(我假设我可以使用seq
或echo
一起使用?):
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)
我已经手动输入了这两个列表,但我希望能提供有关如何从命令行完成此操作以供将来需要和学习(seq
或echo
,我假设)的任何输入。
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)
jim*_*mij 10
我的曲折:
纯的 awk
awk 'BEGIN{for(;n<31;)print ++n"|"n","}'
Run Code Online (Sandbox Code Playgroud)printf
+ xargs
printf '%s\n' {0..31} | xargs -I {} echo "{}|{},"
Run Code Online (Sandbox Code Playgroud)repeat
循环 zsh
n=0; repeat 32 echo "$n|$((n++)),"
Run Code Online (Sandbox Code Playgroud)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)
小智 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)
一些复杂的:
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,如果你想打印一个数字序列,最好的工具是awk
和bc
。bc
可以进行任意精度算术,但在格式化输出时非常有限,因此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)