Bash 使用“粘贴”并注意输入文件名
假设我有两个文件:foo.tsv和bar.tsv,其内容如下所示: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
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环境干净。。。