입력 파일을 처리하고 출력 파일을 생성하는 스크립트가 있습니다. 각 파일의 기본 이름을 출력 파일의 일부로 만들고 싶지만 작동하지 않습니다.
while IFS= read -r line
do
tmp_header="tmp_header"
echo "Processing $line"
Sample_name=`basename -s .fastq.gz $line`
gsutil cat $line | zcat | awk 'BEGIN {FS = ":"} {lane=$4 ; print > "${Sample_name}.lane."lane".fastq.gz" ; for (i = 1; i <= 3; i++) {getline ; print > "${Sample_name}.lane."lane".fastq.gz"}}'
done < "test.list.paths.Bcancer2.txt"
$ cat test.list.paths.Bcancer2.txt
gs://fc-0e96c1b9-ba10-44f3-8b07-91a4c1a5cf14/10002/10002_R1.fastq.gz
결과물 파일
-rw-r--r-- 1 xkwaku001 2.2G Jul 8 05:54 '${Sample_name}.lane.2.fastq.gz'
하지만 내 결과는 다음과 같습니다.
$ 10002_R1.lane.2.fastq.gz
당신의 도움을 주셔서 감사합니다.
답변1
겉보기에 중요해 보이는 부분을 잘라내면 다음과 같습니다.
Sample_name=something
awk '{lane=$4 ; print > "${Sample_name}.lane."lane".fastq.gz"; ...}'
# ^ * * ^
Sample_name
그리고 awk가 파일 이름에 쉘 변수 값을 사용하기를 원할 수도 있습니다. 변수가 작은따옴표로 묶인 문자열 안에 있기 때문에 쉘은 변수를 확장하지 않습니다. (큰따옴표로 묶인 경우 스크립트에서 큰따옴표와 달러 기호를 이스케이프해야 합니다.) awk는 awk 스크립트의 큰따옴표로 묶인 문자열 안에 있기 때문에 확장하지 않습니다(그리고 awk가 아닌 쉘 구문입니다) 통사론).
따라서 이를 수행하는 가장 쉬운 방법은 쉘 변수를 awk에 전달하고 awk -v
, 지금 사용하는 것처럼 awk 스크립트에서 이를 사용하는 것입니다 line
. 단순화된 예:
Sample_name=foobar
awk -v SN="$Sample_name" 'BEGIN {lane=123; print SN ".lane." lane ".fastq.gz" }'
실행할 때 인쇄됩니다 foobar.lane.123.fastq.gz
.
답변2
당신은 사용하고 있습니다껍데기awk 스크립트 내의 변수이지만 $sample_name
awk는 해당 변수에 액세스할 수 없습니다. 게다가 인용되었으므로 awk는 이를 사용자가 보는 문자열로 취급합니다. 다음은 스크립트의 작업 버전입니다.
while IFS= read -r line
do
tmp_header="tmp_header"
echo "Processing $line"
Sample_name=$(basename -s .fastq.gz "$line")
gsutil cat "$line" | zcat |
awk -v sname="$Sample_name" '
BEGIN {FS = ":"}
{
lane=$4;
fileName = sname".lane."lane".fastq.gz"
print > fileName
for (i = 1; i <= 3; i++) {
getline
print > fileName
}
}'
done < test.list.paths.Bcancer2.txt
답변3
작은 따옴표를 큰 따옴표로 바꾸고 awk 프로그램에서 따옴표를 이스케이프하면 더 행복해질 것이라고 확신합니다. 또한 -F를 사용하여 awk 실행에 대한 필드 구분 기호를 지정하고 BEGIN 블록에 이를 설정하지 않아도 되도록 입력 cat $line | zcat ...
할 수 있습니다 .zcat $line ...
고양이의 쓸모없는 사용.
이게 도움이 되길 바란다!