Bash 使用“粘贴”并注意输入文件名

Bash 使用“粘贴”并注意输入文件名,bash,paste,Bash,Paste,假设我有两个文件:foo.tsv和bar.tsv,其内容如下所示: foo.tsv 1 2 3 4 5 bar.tsv a b c d e 如果我运行paste foo.tsv bar.tsv>foo_bar.tsv,我会得到: 虽然这很好,但我想自动命名foo_bar.tsv,以消除以错误文件结尾的可能性,例如,在输入错误的情况下 比如说: 粘贴foo.tsv baz.tsv>foo_-bar.tsv foo_-bar应该是foo_-baz 在2个输入的简单情况下,很难出错,但如果我这样做

假设我有两个文件:foo.tsv和bar.tsv,其内容如下所示:

foo.tsv
1
2
3
4
5

bar.tsv
a
b
c
d
e
如果我运行paste foo.tsv bar.tsv>foo_bar.tsv,我会得到:

虽然这很好,但我想自动命名foo_bar.tsv,以消除以错误文件结尾的可能性,例如,在输入错误的情况下

比如说:

粘贴foo.tsv baz.tsv>foo_-bar.tsv foo_-bar应该是foo_-baz

在2个输入的简单情况下,很难出错,但如果我这样做:

粘贴foo.tsv baz.tsv bar.tsv baz.tsv>foo_baz_bar_baz.tsv

事情可能会变得一团糟


是否有自动命名输出文件的方法?如何使重定向操作符知道其输入

您可以使用数组跟踪要粘贴在一起的文件:

files=("foo.tsv" "bar.tsv")
files=("foo.tsv" "bar.tsv")
paste "${files[@]}" > "$(IFS=_; echo "${files[*]%.*}".tsv)"
然后,paste${files[@]}将展开以粘贴foo.tsv bar.tsv

最后,要重定向到名称基于参数的文件,可以使用

$ IFS=_
$ echo "${files[*]%.*}"
foo_bar
也就是说,删除从最后一个点到数组中所有元素的所有内容,然后将内部字段分隔符设置为389;一起打印

中描述了对数组中的所有元素执行相同的操作,并使用${var[*]}将它们打印在一起,这是对注释中的建议的赞扬

然后,将粘贴命令重定向到使用此printf创建的文件:

总而言之:

files=("foo.tsv" "bar.tsv")
files=("foo.tsv" "bar.tsv")
paste "${files[@]}" > "$(IFS=_; echo "${files[*]%.*}".tsv)"

可以使用数组跟踪要粘贴在一起的文件:

files=("foo.tsv" "bar.tsv")
files=("foo.tsv" "bar.tsv")
paste "${files[@]}" > "$(IFS=_; echo "${files[*]%.*}".tsv)"
然后,paste${files[@]}将展开以粘贴foo.tsv bar.tsv

最后,要重定向到名称基于参数的文件,可以使用

$ IFS=_
$ echo "${files[*]%.*}"
foo_bar
也就是说,删除从最后一个点到数组中所有元素的所有内容,然后将内部字段分隔符设置为389;一起打印

中描述了对数组中的所有元素执行相同的操作,并使用${var[*]}将它们打印在一起,这是对注释中的建议的赞扬

然后,将粘贴命令重定向到使用此printf创建的文件:

总而言之:

files=("foo.tsv" "bar.tsv")
files=("foo.tsv" "bar.tsv")
paste "${files[@]}" > "$(IFS=_; echo "${files[*]%.*}".tsv)"

您还可以设置一个函数来完成大部分工作

pastefile(){

    for i in "$@";do
       newfile+="${i%.*}_"
    done
    ext="${1##*.}"

    paste "$@" > "${newfile%_}.${ext}"

}
作为

$ pastefile foo.tsv bar.tsv
$ cat foo_bar.tsv

1       a
2       b
3       c
4       d
5       e

还可以使用带空格的文件名。

您还可以设置一个函数,为您完成大部分工作

pastefile(){

    for i in "$@";do
       newfile+="${i%.*}_"
    done
    ext="${1##*.}"

    paste "$@" > "${newfile%_}.${ext}"

}
作为

$ pastefile foo.tsv bar.tsv
$ cat foo_bar.tsv

1       a
2       b
3       c
4       d
5       e

也可以使用带空格的文件名。

很好地使用BASH数组+,一种处理尾随下划线的方法:files=foo.tsv bar.tsv;IFS=u2;;echo${files[*]%.*}@anishsane好极了!非常感谢,我总是忘记${array[*]}您可能可以将IFS=uu放入$。。。作为$IFS=u2;;echo${files[*]%.*}.tsv,以保持父shell环境干净…很好地使用BASH array++处理尾部下划线的一种方法:files=foo.tsv bar.tsv;IFS=u2;;echo${files[*]%.*}@anishsane好极了!非常感谢,我总是忘记${array[*]}您可能可以将IFS=uu放入$。。。作为$IFS=u2;;echo${files[*]%.*}.tsv,以便保持父shell环境干净。。。