Bash
For循環遍歷目錄樹從同名文件中提取結果
我有一系列目錄,
list.txt
格式相同,我希望將結果放入一個文件中。我希望編寫一個腳本,該腳本將迭代地遍歷每個目錄樹,list.txt
使用下面的 grep/awk 管道從文件中提取特定列而不包含文本,並將每個目錄的輸出寫入同一個文件。grep 'bar[0-9]' file.txt | awk '{print $1}'
我嘗試了以下操作,但我不確定腳本中的循環到底哪裡出錯了。
#!/bin/bash ##Extract ligands from toplist and concatenate to file for i in /home/ubuntu/Project/working/library_*/Results/list.txt do grep 'bar[0-9]' i | awk '{print $1}' | cat ../output.txt i done
目錄樹如下:
. ├── library_1-200 │ ├── Results │ │ ├── complex │ │ ├── sorted.txt │ │ └── list.txt │ ├── files │ │ ├── output │ │ └── txt │ └── summary.txt ├── library_201-400 │ ├── Results │ │ ├── complex │ │ ├── sorted.txt │ │ └── list.txt │ ├── files │ │ ├── output │ │ └── txt │ └── summary.txt ├── library_401-600 │ ├── Results │ │ ├── complex │ │ ├── sorted.txt │ │ └── list.txt │ ├── files │ │ ├── output │ │ └── txt │ └── summary.txt └── library_601-800 ├── Results │ ├── complex │ ├── sorted.txt │ └── list.txt ├── files │ ├── output │ └── txt └── summary.txt
的樣本
list.txt
,我只想將Name
值放入output.txt
Name Score bar65 -7.8 bar74 -7.5 bar14 -7.5 bar43 -7.4 bar94 -7.4 bar16 -7.4 bar12 -7.3 bar25 -7.3 bar65 -7.3 bar76 -7.3 bar24 -7.3 bar13 -7.3 bar58 -7.2 bar68 -7.2 bar28 -7.2
解決方案是將“$i”放在我之前只有 i 的位置並修改為
| cat >> ../output.txt
您正在使用
i
, 而不是$i
在 grep 命令中使用此用法。你說你想把它們都放在一個文件中,那麼最後一個命令應該是:
cat >> /home/ubuntu/Project/working/output.txt
要不就:
>> /home/ubuntu/Project/working/output.txt
除了更正原始程式碼中的一些小錯別字(使用
"$i"
代替i
並將輸出重定向到輸出文件而不是嘗試輸出其內容)之外,如果您沒有數千個這樣的list.txt
文件:awk '/^bar[0-9]/ { print $1 }' /home/ubuntu/Project/working/library_*/Results/list.txt >output.txt
這
awk
用於提取以字元串開頭的所有行的第一列,bar
後跟一個數字。它對匹配 patten 的所有文件執行此操作/home/ubuntu/Project/working/library_*/Results/list.txt
。提取的數據被重定向到output.txt
.當文件名通配模式
/home/ubuntu/Project/working/library_*/Results/list.txt
擴展到太多名稱時,循環變得必要:for pathname in /home/ubuntu/Project/working/library_*/Results/list.txt; do awk '/^bar/ { print $1 }' "$pathname" done >output.txt
請注意,重定向循環的輸出比重定向每個單獨的
awk
呼叫更有效。另請注意,它awk
可以輕鬆grep
檢測所需線路,而這cat
不是必需的。如果您需要除第一列之外的所有行中的第一列(如範例數據中所示),您可以將
awk
程式碼中的條件從更改/^bar[0-9]/
為FNR > 1
。