일련의 디렉터리가 모두 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
필요한 줄을 감지하는 작업을 쉽게 수행할 수 있지만 이것이 필수는 아닙니다.grep
cat
첫 번째 열을 제외한 모든 행에 첫 번째 열이 필요한 경우(샘플 데이터에 표시됨) awk
코드의 조건을 에서 로 변경할 /^bar[0-9]/
수 있습니다 FNR > 1
.