두 개의 파일을 사용하여 스크립트를 작성하는 데 도움이 필요합니다. 파일 1은 아미노산을 특정 순서로 나열하고(하나는 다른 순서로, 반복될 수도 있음) 두 번째 파일 2는 각 아미노산 아래에 나열된 기능을 구성합니다. 여기서는 목록 1(파일 1)의 아미노산을 일치시켜 두 번째 파일(파일 2)의 동일한 아미노산 아래에 특성을 나열하고 이를 파일 1에서 언급한 것과 동일한 순서로 출력 파일에 복사하려고 합니다. .
예를 들어 파일 1.txt
Threonine
Glutamine
Alanine
Asparatate
Glutamine
Alanine
Threonine
파일 2.txt
[ Alanine ]
89.1 13.7 -3.12 -10.09
[ Asparatate ]
133.1 30 -2.43 -10.35
[ Glutamine ]
146.1 42.7 -3.46 -10.23
[ Threonine ]
119.1 28.5 -2.43 -9.99
내가 원하는 출력은 다음과 같습니다:output.txt
[ Threonine ]
119.1 28.5 -2.43 -9.99
[ Glutamine ]
146.1 42.7 -3.46 -10.23
[ Alanine ]
89.1 13.7 -3.12 -10.09
[ Asparatate ]
133.1 30 -2.43 -10.35
[ Glutamine ]
146.1 42.7 -3.46 -10.23
[ Alanine ]
89.1 13.7 -3.12 -10.09
[ Threonine ]
119.1 28.5 -2.43 -9.99
단어 대신 숫자를 색인으로 사용하는 awk에서 다음 스크립트를 사용해 보았지만 이 목적으로는 작동하지 않습니다.
awk 'FNR==NR { a[ "\\[ " $1 " \\]" ]; next } /^\[/ { f=0 } { for (i in a) if ($0 ~ i) f=1 } f' file1.txt file2.txt > output.txt
단어에 맞게 작동하도록 스크립트를 수정하는 방법을 모르겠습니다. 내가 어디로 잘못 가고 있는지 알려주고 스크립트를 실행하여 원하는 결과를 얻을 수 있도록 도와주세요.
귀하의 도움에 매우 감사하겠습니다.
미리 감사드립니다.
아샤
답변1
acid를 반복해서 File1.txt
+ 1개 행에서 일치하는 모든 행을 찾아야 합니다 File2.txt
. 이 작업은 쉽게 수행할 수 있습니다.grep
for acid in $(sed 's/^\s*//' File1.txt)
do
grep -FA1 "$acid" File2.txt
done > Output.txt
하지만 당신이 원한다면 awk
:
awk '
FNR!=NR{
print " [",$1,"]"
print acids[$1]
next
}
/\[/{
acid=$2
next
}
{
acids[acid]=$0
}' File2.txt File1.txt > Output.txt
답변2
이를 수행하는 빠른 방법은 다음을 사용하는 것입니다.
while read amino_acid
do
grep -A1 ${amino_acid} File2.txt >> output.txt
done < File1.txt
답변3
그리고 xargs
/ grep
:
xargs -n1 -I '{}' grep '{}' -A1 File2.txt <File1.txt
설명하다:
-n1
: xargs가 각 줄에서 명령을 실행하도록 강제합니다.-I '{}'
: 자리 표시자 설정grep '{}' -A1 File2.txt
: 실행할 명령-A1
:검색 패턴 다음 줄도 인쇄합니다.File2.txt
: 검색 슬롯File2.txt
<File1.txt
: 입력은File1.txt