粘贴和括号扩展与通配符

粘贴和括号扩展与通配符

为什么大括号扩展的行为与通配符与 的组合不同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.
}

相关内容