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