Bash

For循環遍歷目錄樹從同名文件中提取結果

  • May 27, 2019

我有一系列目錄,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

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