244개 파일에서 특정 패턴을 grep하고 하나의 명령으로 각 파일에 대해 별도의 출력 파일을 생성하고 싶습니다. 어떻게 해야 합니까?
단일 파일에 대한 내 명령은 다음과 같습니다.
grep -v '@SQ' *.sam | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > output_count_file.txt
각 개별 파일에 대해 244번이 아닌 한 번에 이 작업을 수행하려면 어떻게 해야 합니까?
내 입력 파일의 예는 다음과 같습니다.
A1_001.fastq.sam
A2_001.fastq.sam
B6_001.fastq.sam
이러한 입력 파일의 일부 정보를 해당 출력 파일로 가져오고 싶습니다. 예를 들면 다음과 같습니다.
A1_001.txt
A2_001.txt
B6_001.txt
이러한 출력 파일에서 출력 파일의 정보를 다른 파일로 병합하려면 grep을 다시 수행해야 합니다.
이 파일 중 하나(예: A1_001.fastq.sam)를 grep하면 다음과 같은 결과가 나타납니다.
33 chr20:4804587-4804609__hsa_VP64_wgcod_3_27753
33 chr13:113242648-113242670__hsa_VP64_wgcod_2_46197
32 chr8:144718034-144718056__hsa_VP64_wgcod_2_48778
30 chr6:24126264-24126286__hsa_VP64_wgcod_1_71312
다음 정보가 포함된 참조 파일과 비교하여 두 번째 열(예: chr20:4804587-4804609)에서 유전자 이름을 식별해야 합니다.
GTGCGCAGCGCTGAGTGTCG YBEY NM_001006114_utr5_0_0_chr21_47706267_f;NM_058181_utr5_0_0_chr21_47706267_f chr21 47706143 47706165
AGCAGGCGGACAGTAGGACG AUP1 NM_181575_utr5_11_0_chr2_74756757_r chr2 74757053 74757075
TAGGGGCAATGAATGGCGAG APEX2 NM_001271748_utr5_0_0_chrX_55026756_f;NM_014481_utr5_0_0_chrX_55026756_f chrX 55026610 55026632
내 질문이 너무 복잡하지 않기를 바랍니다.
답변1
플래그를 사용하여 find
이를 달성할 수 있습니다 -exec
. 그러면 디렉터리의 모든 파일을 반복하고 grep
각 파일을 개별적으로 실행합니다. 출력 파일을 구별하기 위해 자리 표시자를 배치할 수 있습니다.
명령은 다음과 같습니다.
$ find . -iname "*.sam" -exec grep -v '@SQ' {} | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > {}_output_count_file.txt \;
참고: 아직 테스트하지 않았으므로 이스케이프 및 자리 표시자와 관련된 일부 문제를 해결해야 할 수도 있지만 시작에 불과합니다.
답변2
단일 파일을 처리할 수 있는 함수를 만들 수 있는지 확인하세요.
doit() {
sam=$1
grep -v '@SQ' "$sam".sam |
grep -v '@HD' |
cut -f 3 |
sort |
uniq -c |
sort -nrk1 > "$sam"_count.txt
}
export -f doit
parallel doit {.} ::: *.sam