For 循环迭代目录树,从同名文件中提取结果

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

答案1

您正在使用i, 而不是$igrep 命令中的这种用法。

你说你想将它们全部放入单个文件中,那么最后一个命令应该是:

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的工作,但这是不需要的。grepcat

如果您需要除第一行之外的所有行中的第一列(如示例数据中所示),您可以将代码中的条件awk从更改/^bar[0-9]/FNR > 1

相关内容