특정 키워드 파일에 지정된 순서대로 Excel 파일(.xls)에서 행이 포함된 키워드를 추출해야 합니다. 예를 들어 아래와 같이 Excel 파일(예: 게놈.xls)이 있습니다.
NC_0208.1 18918 94692 amyl4_A0A0H 1 54 194
NC_0208.1 18839 86123 prot4_A0A0 1 79 137
NC_0208.4 29761 74985 lip10_H8FLU5 2 393 48
NC_0208.2 29687 67745 lysin6_A0A0Q5 5 38 49
아래와 같이 키워드 파일(예: id.txt)이 있습니다.
prot
lip
cellulase
lysin
amyl
예상 출력은 다음과 같습니다.
NC_0208.1 18839 86123 prot4_A0A0 1 79 137
NC_0208.4 29761 74985 lip10_H8FLU5 2 393 48
NC_0208.2 29687 67745 lysin6_A0A0Q5 5 38 49
NC_0208.1 18918 94692 amyl4_A0A0H 1 54 194
또한, 게놈 파일에 키워드가 없으면 출력 파일에서 전체 줄을 비워 두어야 합니다. 이를 위해 아래와 같이 grep 명령을 사용했습니다.
grep 'prot\|lip\|cellulase\|lysin\|amyl' genome.xls > result.xls
위 명령은 전체 행을 포함하는 키워드를 추출하지만 순서가 변경되었습니다. 또한 누락된 키워드에 대해 빈 줄을 남기지 않습니다. 그러니 나도 그렇게 할 수 있도록 도와주세요. 미리 감사드립니다.
답변1
이 시도,
while read a ; do grep "$a" genome.xls || printf "\n" ; done < id.txt
NC_0208.1 18839 86123 prot4_A0A0 1 79 137
NC_0208.4 29761 74985 lip10_H8FLU5 2 393 48
NC_0208.2 29687 67745 lysin6_A0A0Q5 5 38 49
NC_0208.1 18918 94692 amyl4_A0A0H 1 54 194
답변2
귀하의 요구 사항에는 키워드 반복이 필요하다고 생각합니다. 나는 다음 셸 스크립트를 권장합니다(원하는 경우 한 줄로 처리할 수도 있음).
#!/bin/bash
while read keyword
do
# Apply grep, but store result in variable
MATCH="$(grep $keyword genome.xls)"
# If grep result is an empty string, output an empty line,
# otherwise the grep result as-is.
if [[ -z "$MATCH" ]]
then
echo
else
echo "$MATCH"
fi
done < id.txt
내용을 반복하여 출력 순서를 보장할 수 있습니다 id.txt
.
호출 스크립트
user@host$ ./extract_lines.sh > result.xml
스크립트를 보다 유연하게 만들기 위해 파일을 명령줄 인수 또는 명령줄 인수 목록으로 처리하도록 설정할 수 있습니다.
#!/bin/bash
if [[ "$#" == "0" ]]
then
echo "Usage: $0 <filename(s)>"
exit 1
fi
for file in "$@"
do
outfile=${file/.xls/_result.xls}
:>$outfile
echo "Process $file, write results to $outfile"
while read keyword
do
# Apply grep, but store result in variable
MATCH="$(grep $keyword $file)"
# If grep result is an empty string, output an empty line,
# otherwise the grep result as-is.
if [[ -z "$MATCH" ]]
then
echo "" >> $outfile
else
echo "$MATCH" >> $outfile
fi
done < id.txt
done
이것은 명령줄 인수로 지정된 모든 파일을 반복 *.xls
하고 결과를 기록합니다 <input_filename>_result.xls
.
노트*
그러나 이 구문은 파일 이름 사양을 "globs"(예: 와 같은 와일드카드) 및 인수 목록의 일반 파일 이름과 혼합하면 안 되기 때문에 약간 초보적입니다 .