
我有一系列目錄,全部具有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
答案1
您正在使用i
, 而不是$i
grep 命令中的這種用法。
你說你想將它們全部放入單一檔案中,那麼最後一個指令應該是:
cat >> /home/ubuntu/Project/working/output.txt
要不就:
>> /home/ubuntu/Project/working/output.txt
答案2
除了修正原始程式碼中的一些小拼字錯誤(使用"$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
。