【问题标题】:How to pass multiple files with variable filenames to the paste command如何将具有可变文件名的多个文件传递给粘贴命令
【发布时间】:2020-01-19 00:37:09
【问题描述】:

通常当我们希望按列连接多个文件并且文件的文件名只是连续递增的整数时,我们可以执行以下操作:

#Imagine I have 10 files
paste {1..10} > out

但是,我目前正在编写一个范围是变量的脚本,所以我希望能够做这样的事情

first=1
last=10
paste {"${first}".."${last}"} > out

这不起作用,因为变量不能在花括号内正确展开。是否可以使用其他语法来实现相同的结果?

【问题讨论】:

  • eval paste {"${first}".."${last}"} > file ?但是 `eval 很危险,所以请仔细阅读。祝你好运。
  • 文件名是只是数字,还是像file{1..10}.txt(或更糟糕的是"$prefixvar"{1..10}."$ext")这样更复杂的东西?
  • 在我的特殊情况下,文件名只是数字,没有任何其他内容

标签: bash shell command paste


【解决方案1】:

如果不想使用eval,可以使用seq(1)

seq -s ' ' "$first" "$last"

像这样:

paste $(seq -s ' ' "$first" "$last") > out

【讨论】:

  • 我可以将这个想法用于我的脚本,谢谢
【解决方案2】:

从前需要一个类似 seq 的函数,但速度更快,所以我做了这个

# Create sequence like {0..X}
cnt () { printf -v N %$1s; N=(${N// / 1}); printf "${!N[*]}"; }

$ cnt 5
0 1 2 3 4

如果我们稍微修改一下

# Create sequence like {X..Y}
cnt () { printf -v N %$2s; N=(${N// / 1}); N=(${!N[@]}); printf "${N[*]:$1} ${#N[@]}"; }

$ cnt 7 11
7 8 9 10 11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多