如何将具有可变文件名的多个文件传递给粘贴命令
How to pass multiple files with variable filenames to the paste command
通常当我们希望按列连接多个文件并且文件名只是连续递增的整数时,我们可以执行以下操作:
#Imagine I have 10 files
paste {1..10} > out
但是,我目前正在编写一个脚本,其中的范围是变量,所以我希望能够做这样的事情
first=1
last=10
paste {"${first}".."${last}"} > out
这不起作用,因为无法在花括号内正确扩展变量。我可以使用其他语法来获得相同的结果吗?
如果不想用eval
,可以用seq(1):
seq -s ' ' "$first" "$last"
像这样:
paste $(seq -s ' ' "$first" "$last") > out
曾几何时,需要一个类似 seq 的函数,但速度更快,所以我做了这个
# Create sequence like {0..X}
cnt () { printf -v N %s; N=(${N// / 1}); printf "${!N[*]}"; }
$ cnt 5
0 1 2 3 4
如果我们稍微修改一下
# Create sequence like {X..Y}
cnt () { printf -v N %s; N=(${N// / 1}); N=(${!N[@]}); printf "${N[*]:} ${#N[@]}"; }
$ cnt 7 11
7 8 9 10 11
通常当我们希望按列连接多个文件并且文件名只是连续递增的整数时,我们可以执行以下操作:
#Imagine I have 10 files
paste {1..10} > out
但是,我目前正在编写一个脚本,其中的范围是变量,所以我希望能够做这样的事情
first=1
last=10
paste {"${first}".."${last}"} > out
这不起作用,因为无法在花括号内正确扩展变量。我可以使用其他语法来获得相同的结果吗?
如果不想用eval
,可以用seq(1):
seq -s ' ' "$first" "$last"
像这样:
paste $(seq -s ' ' "$first" "$last") > out
曾几何时,需要一个类似 seq 的函数,但速度更快,所以我做了这个
# Create sequence like {0..X}
cnt () { printf -v N %s; N=(${N// / 1}); printf "${!N[*]}"; }
$ cnt 5
0 1 2 3 4
如果我们稍微修改一下
# Create sequence like {X..Y}
cnt () { printf -v N %s; N=(${N// / 1}); N=(${!N[@]}); printf "${N[*]:} ${#N[@]}"; }
$ cnt 7 11
7 8 9 10 11