동일한 이름의 파일에서 결과를 추출하는 디렉터리 트리를 반복하는 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싶습니다.Nameoutput.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. patten 과 일치하는 모든 파일에 대해 이 작업을 수행합니다 /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.

관련 정보