为什么大括号扩展的行为与通配符与 的组合不同paste
?
示例:假设我们有多个文件夹,每个文件夹都包含相同结构的 tsv,并且想要创建一个包含每个文件夹的第 5 行的“all.tsv”。这两个命令的行为不同:
paste -d, <(cut -d$'\t' -f5 {test,test1,test2}/example.tsv) > all.tsv
与
paste -d, <(cut -d$'\t' -f5 test*/example.tsv) > all.tsv
第一个按预期创建一个具有 3 列的 tsv,第二个创建一个单列 tsv,其中的值位于彼此下方。
我的问题是文件夹列表任意大,可能很长并且不连续。
有没有一种方法可以实现与使用通配符进行大括号扩展相同的行为,而无需移动到 bash 脚本并迭代文件夹?
使用 GNU bash
答案1
您正在寻找的行为是 bash-3.2(macOS 上的版本)和 bash-4.0 之间修复的错误。从更改文件:
rr。大括号扩展现在允许进程替换不变地通过。
对于单行代码,您可以尝试 awk:
awk -F '\t' {FNR != NR {exit} {out=$5; for (i = 2; i < ARGC; i++) {getline < ARGV[i]; out = out "," $5}; print out}' test*/example.tsv
解释:
FNR != NR { exit } # Exit after first file is finished.
{
out=$5; # save the first file's fifth field
for (i = 2; i < ARGC; i++) { # loop over the remaining arguments (filenames).
getline < ARGV[i]; # Read in the next line from i-th file.
out = out "," $5 # save fifth field of the line just read
};
print out # print saved columns.
}