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