다음과 같은 파일이 있습니다(5개의 탭으로 구분된 열).
head allKO.txt
Metabolism Carbohydrate metabolism Glycolisis K07448
Metabolism Protein metabolism protesome K02217
파일의 5번째 열에서 패턴(문자열)을 검색하고, 발견되면 패턴이 발견된 줄과 모든 열을 KEGG.annotations
다른 파일에 인쇄하고 싶습니다 . 패턴을 찾고 있는 파일은 다음과 같습니다.KEGG.annotations
allKO.txt
head KEGG.annotations
>aai:AARI_24510 proP; proline/betaine transporter; K03762 MFS transporter, MHS family, proline/betaine transporter
>aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
>aai:AARI_28260 hypothetical protein
>aai:AARI_29060 ABC drug resistance transporter, inner membrane subunit; K09686 antibiotic transport system permease protein
>aai:AARI_29070 ABC drug resistance transporter, ATP-binding subunit (EC:3.6.3.-); K09687 antibiotic transport system ATP-binding protein
>aai:AARI_29650 hypothetical protein
>aai:AARI_32480 iron-siderophore ABC transporter ATP-binding subunit (EC:3.6.3.-); K02013 iron complex transport system ATP-binding protein [EC:3.6.3.34]
>aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system protein
나는 다음과 같은 것을 원합니다 :
Metabolism Carbohydrate metabolism Glycolisis K07448 >aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system
Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
첫 번째 행에 추가 된 >aai:AARI_33320 mrr; restriction …
텍스트는 8번째 행이며 여기에는 첫 번째 행(5번째 필드)의 ID 필드가 KEGG.annotations
포함됩니다 .K07448
allKO.txt
내 스키마 파일을 사용하려면 이 코드를 어떻게 수정해야 합니까? 이는 찾고 있는 특정 패턴을 포함하는 열이 하나만 있는 패턴 파일에 적용됩니다.
while read pat; do
grep "$pat" --label="$pat" -H < KEGG.annotations;
done < allKO.txt > test1
답변1
기존 코드를 사용할 수 있습니다. 행을 배열에 저장하고 다섯 번째 요소와 일치시킵니다.
while read -r line; do
[ -z "$line" ] && continue
patlist=($line)
pat=${patlist[4]}
grep "$pat" --label="$line" -H < KEGG.annotations
done < allKO.txt
반품:
Metabolism Carbohydrate metabolism Glycolisis K07448:>aai:AARI_33320 mrr; restriction system protein Mrr; K07448 restriction system protein
Metabolism Protein metabolism protesome K02217:>aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1]
답변2
이는 귀하의 요구 사항을 충족하는 것 같습니다.
while read w1 w2 w3 w4 ID
do
printf "%s " "$w1 $w2 $w3 $w4 $ID"
if ! grep "$ID" KEGG.annotations
then
echo
fi
done < allKO.txt
그러면 화면에 출력이 기록됩니다. 파일에 출력을 캡처하려면 마지막 줄에 출력( >
) 리디렉션(예: )을 추가합니다.> test1
- 귀하의 예에 따르면 키/ID 필드("스키마")는 다음과 같습니다.다섯~의다섯필드가 탭으로 구분된 파일이라고 말씀
allKO.txt
하셨습니다read w1 w2 w3 w4 ID
. 모든 필드에 공백이 없다고 가정합니다. - 끝에 공백이 있지만 종료되는 줄 바꿈이 없는 줄
printf
(즉, 필드)을 작성( )하세요.allKO.txt
grep
( ) 파일 에서KEGG.annotations
ID( from 행의 다섯 번째 필드)를 검색합니다allKO.txt
. 이는 완전한 라인(개행 포함)입니다.grep
실패 하면printf
줄 바꿈이 없기 때문에 개행을 작성하십시오.이렇게 하면 존재하지 않는 ID가 있는 행이
KEGG.annotations
단순히 출력에 기록됩니다.Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1] This ID doesn’t exist: K99999
그리고 여러 번 존재하는 ID는 데이터를 반복하지 않고 추가 행에 기록됩니다
allKO.txt
.Metabolism Protein metabolism proteasome K02217 >aai:AARI_26600 ferritin-like protein; K02217 ferritin [EC:1.16.3.1] This is a hypothetical additional line from KEGG.annotations that mentions “K02217”.