bash 쉘에서 awk $1 $2를 사용하는 방법은 무엇입니까?

bash 쉘에서 awk $1 $2를 사용하는 방법은 무엇입니까?
cat << EOF > test.sh

cat $FILEA $FILEB | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\\t '{print $1 "\t" NR "\t\t" $2 "\t" $3 "\t\t.\t\t" NR}' > unionpeaks.gff

EOF

출력 파일에서 $1 $2 $3을 awk에 전달할 수 없다는 것을 발견했습니다. 나는 가지고있다:

cat /file1.narrowPeak /file2.narrowPeak | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\t '{print  "\t" NR "\t\t"  "\t"  "\t\t.\t\t" NR}' > merge.gff

답변1

이 문서의 $1, $2, $3은 있는 그대로 대체됩니다 cat. 이 시점에서는 매개변수가 의미가 없으며 빈 문자열로 대체됩니다. 고려하다:

bash-4.4$ cat << EOF > test2.sh
> >$1<>$2<>$3<
> EOF
bash-4.4$ cat test2.sh 
><><><

답변2

첫째, 이 접근 방식이 약간 중복된다는 점을 간단히 지적하는 것은 쉽습니다. 하지만 한 번에 한 가지 일만 하세요...

를 사용하면 cat <<EOF인라인 명령이나 교체로 구문 분석될 수 있는 모든 항목이 인라인 명령으로 구문 분석됩니다. 즉, 구분된 문서를 만들기 전에 $1및 같은 항목이 $(...)먼저 평가됩니다. 이를 방지하려면 가장 간단한 옵션은 작은따옴표입니다 EOF.

cat <<'EOF'
heredoc string stuff in here
EOF

하지만 그것이 당신이 원하는 것인지 잘 모르겠습니다. 파일에 표시하고 싶은 내용이 있으면 거기에 파이프하면 됩니다.

cat $FILEA $FILEB | sort -k1,1 -k2,2n | mergeBed -i - | awk -F\\t '{print $1 "\t" NR "\t\t" $2 "\t" $3 "\t\t.\t\t" NR}' > unionpeaks.gff

Heredoc은 필요하지 않습니다. 이제 명령 자체를 살펴보겠습니다.

sort -k1,1 -k2,2n -- "$FILEA" "FILEB" | mergeBed -i - | awk -v FS="\t" -v OFS="\t" '{ print $1, NR, "", $2, $3, "", ".", "", NR }' > unionpeaks.gff

cat단순히 필요하지 않습니다. 파일 이름을 입력으로 사용할 수 있으므로 추가 호출이 필요하지 않습니다. (대시)로 시작하는 파일이 손상되지 않도록 하기 위해 sorta를 추가했습니다 . 또한 탭으로 구분하려는 것 같으니 (출력 필드 구분 기호)를 탭으로 설정하세요. 예상되는 구분 기호 중 일부는 이중 탭을 사용할 것으로 예상되므로 약간 이상해 보입니다. 따라서 0바이트 문자열(예: .---OFS""

스크립트에서만 명령을 사용하려면 해당 명령을 포함하도록 스크립트 파일을 편집하면 됩니다. EOFheredocs를 배우는 것이 의도된 목적이라면 학습과 스크립트 개선을 결합하세요. :)

관련 정보