스크립트를 사용하거나 코드를 붙여넣을 때 다른 결과

스크립트를 사용하거나 코드를 붙여넣을 때 다른 결과

나는 내 파일에서 산술 연산을 수행하고 데이터 매트릭스를 analyze.txt(헤더가 추가됨)에 내보내는 일부 Unix 코드를 작성했습니다. 그러나 이 코드를 스크립트에 넣고 스크립트를 실행하려고 하면 실제 공백 대신 탭(\t)으로 열이 구분됩니다.

유효한 코드:

for f in */Data/Intensities/BaseCalls/Alignment*/*.bam; do
 echo 'Processing '$f' ... ' 1>&2
 name=${f##*/}
 name=${name%.bam}
 pftot=`samtools view -c $f`
 pfmit=`samtools view -c $f chrM`
 pfgen=$((pftot-pfmit))
 pfratio=`python -c 'print float('$pfmit')/'$pfgen`
 ftot=`samtools view -c -q 30 -F 1536 $f`
 fmit=`samtools view -c -q 30 -F 1536 $f chrM`
 fgen=$((ftot - fmit))
 fratio=`python -c 'print float('$fmit')/'$fgen`
 echo $name'\t'$pftot'\t'$pfmit'\t'$pfgen'\t'$pfratio'\t'$ftot'\t'$fmit'\t'$fgen'\t'$fratio
done | awk 'BEGIN{print 
"name\ttotal\tmDNA\tchrDNA\tratio\tftotal\tfmDNA\tfchrDNA\tfratio"}{print}' 
> Analysis.txt

작동하지 않는 코드:

#!/bin/bash
for f in */Data/Inten... "the above code"

달리다:

bash Analysis.sh

리터럴 "\t" 구분 기호를 사용하여 마지막으로 에코된 줄의 변수를 인쇄합니다.

저는 초보자이므로 조언이나 자료를 주시면 감사하겠습니다.

답변1

이 줄은:

echo $name'\t'$pftot'\t'$pfmit'\t'$pfgen'\t'$pfratio'\t'$ftot'\t'$fmit'\t'$fgen'\t'$fratio

직접 삽입 됩니다 \t. 다음을 사용하여 쉘 프롬프트에서 다음과 같은 내용을 볼 수 있습니다.

$ export name=hello; echo $name'\t'$name'\t'$name hello\thello\thello

echo가 다음으로 변경되면 echo -e탭이 출력에 포함됩니다.

$ export name=hello; echo -e $name'\t'$name'\t'$name hello hello hello

echo 매뉴얼 페이지에서:

-e 백슬래시 이스케이프 해석을 가능하게 합니다.

-e가 적용되는 경우 다음 시퀀스가 ​​인식됩니다.

  \\     backslash

  \a     alert (BEL)

  \b     backspace

  \c     produce no further output

  \e     escape

  \f     form feed

  \n     new line

  \r     carriage return

  \t     horizontal tab

  \v     vertical tab

답변2

bash(1)내장 명령 섹션의 매뉴얼 페이지를 참조하십시오 . 이 옵션은 이스케이프 문자를 해석하는 데 -e필요합니다 .echo

답변3

대화형 셸이 bash완성되었나요? 아니면 다른 것이 있나요?echo휴대성이 없는 것으로 알려져 있음\t예를 들어 bash에서는 일반 문자 이스케이프를 처리하는 방법을 echo확장하지 않지만 예를 들어 에서는 zsh확장하는 것 같습니다.

$ zsh  -c 'echo "foo\tbar"'
foo     bar
$ bash -c 'echo "foo\tbar"'
foo\tbar

Bash echo -e와 zsh는 echo -E위의 동작을 반대로 합니다.

또한 다음을 수행할 수도 있습니다.이 변수를 따옴표로 묶으십시오.:

#/bin/bash
echo -e "$name\t$pftot\t$etc..."

물론 휴대용 솔루션은 다음과 같습니다 printf.

printf "%s\t%s\t%s..." "$name" "$pftot" "$..."

하지만 사람들이 왜 그것을 사용하고 싶어하는지 알기는 어렵지 않습니다 echo.

관련 정보