Wildcards

粘貼和大括號擴展與萬用字元

  • August 12, 2019

為什麼大括號擴展與萬用字元結合的行為不同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

您正在尋找的行為是在 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.
}

引用自:https://unix.stackexchange.com/questions/534706