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

grep 명령에서 이 사용법이 i아닌 을 사용하고 있습니다 .$i

모든 항목을 단일 파일에 저장하고 싶다면 마지막 명령은 다음과 같아야 합니다.

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패턴과 일치하는 모든 파일에 대해 이 작업을 수행합니다 /home/ubuntu/Project/working/library_*/Results/list.txt. 추출된 데이터는 으로 리디렉션됩니다 output.txt.

/home/ubuntu/Project/working/library_*/Results/list.txt파일 이름 globbing 패턴이 너무 많은 이름으로 확장되면 반복이 필요해집니다.

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.

관련 정보