질문이 있습니다 grep
.
때로는 개체 사이에 하나 이상의 빈 줄이 있는 Uniprot_interactors.txt
코드 목록(예: )이 포함된 파일이 있습니다 .GRT986E
다른 경우에는 TRY546 _ TRE578
대시(예를 들어)로 구분된 두 부분으로 구성된 객체가 있으며 선은 비어 있는 것으로 간주되어야 합니다.
Good_interactors.txt
그 다음에 는 코드 목록이 포함된 또 다른 파일이 있고 각 파일에는 관련 변수(예: aaaaaa
)가 있습니다. output.txt
이 파일에서 출력()을 가져오고 싶지만 grep
첫 번째 파일처럼 줄을 비워두고 싶습니다.
한 가지 예:
파일 1:
UNIPROT_interactors.txt
QR846OI PO3R56 UJ6Y68 YU654R PL92WS GH654Y _ HUY765R PIHYUD
파일 2:
GOOD_Interactors.txt
TYRT68Y aaaaaaaaa QR846OI bbbbbbbbb FDR59I cccccccc PO3R56 ddddddd UJ6Y68 eeeeeee VFR6y7 fffffff PIHYUD gggggggg UH7609 hhhhhhhh
파일
output.txt
(파일 1과 동일한 형식)QR846OI bbbbbbbbb PO3R56 ddddddd UJ6Y68 eeeeeee YU654R PL92WS GH654Y _ HUY765R PIHYUD gggggggg
이 코드를 사용해 봅니다.
grep -f Uniprot_interactors.txt GOOD_interactors.txt > output.txt
그러나 파일 1의 형식은 유지되지 않으며 빈 줄이 제거되었습니다.
답변1
특정 정규식과 일치하는 행(또는 경우에 따라 단어)을 추출하는 것이 grep
목적이므로 여기서는 사용할 수 없습니다 . grep
이 grep
유틸리티는 사용자가 원하는 대로 데이터를 수정하지 않습니다(한 파일에서 다른 파일로 줄에 데이터 추가).
Uniprot 식별자로 키가 지정된 awk
연관 배열에 좋은 상호 작용자를 저장 하는 데 사용됩니다 . names
그런 다음 첫 번째 열의 Uniprot 식별자를 기반으로 이러한 상호작용자를 출력합니다(여러 열이 있거나 알려진 양호한 상호작용자가 변경되지 않은 행을 전달하는 동안).
$ awk 'FNR==NR { names[$1] = $0; next } NF > 1 || !($1 in names) { print; next } { print names[$1] }' GOOD_Interactors.txt UNIPROT_interactors.txt
QR846OI bbbbbbbbb
PO3R56 ddddddd
UJ6Y68 eeeeeee
YU654R
PL92WS
GH654Y _ HUY765R
PIHYUD gggggggg
awk
이 두 파일을 명령에 대한 입력 으로 사용하고 있다는 점에 유의하세요 . 첫 번째 파일을 읽을 때는 FNR==NR
기준을 충족하는 블록만 트리거되고, 두 번째 파일을 읽을 때는 해당 블록을 건너뜁니다.
특수 변수 FNR
, NR
및 NF
는 읽은 레코드(행) 수입니다.현재의파일에서 읽은 레코드 수와 현재 레코드의 필드(열) 수입니다.
답변2
비어 있으면 file1 줄을 반복하고, 그렇지 않으면 해당 데이터를 grep하고 인쇄합니다.
while read line ; do
if ((${#line}));then
grep "${line}" file2
else
echo
fi
done < file1 > output.txt
또는
file2content="$(cat file2)";
while read line ; do
if ((${#line}));then
grep "${line}" <<< "${file2content}"
else
echo
fi
done < file1 > output.txt