첫 번째 필드로 필터링해야 하는 대용량 파일이 있습니다(반복되지 않음). 예는 다음과 같습니다:
NC_056429.1_398 2 3 0.333333 0.333333 0.333333 0.941178
NC_056429.1_1199 2 0 0.333333 0.333333 0.333333 0.941178
NC_056442.1_7754500 0 3 0.800003 0.199997 0.000000 0.000001
NC_056442.1_7754657 1 2 0.000000 0.199997 0.800003 0.888891
NC_056442.1_7754711 2 0 0.888891 0.111109 0.000000 0.800002
NC_056442.1_7982565 0 1 0.800003 0.199997 0.000000 0.666580
NC_056442.1_7982610 1 0 0.800003 0.199997 0.000000 0.000000
NC_056442.1_7985311 2 0 0.888891 0.111109 0.000000 0.000000
awk를 사용하여 쉘 스크립트의 첫 번째 열을 기준으로 파일을 필터링하려고 하는데 while 루프에 있기 때문에 변수를 사용해야 합니다. while 루프는 텍스트 파일을 호출합니다. 예를 들면 다음과 같습니다.
NC_056442.1 7870000 # 1st field = $chrname, 2nd field = $pos
NC_056443.1 1570000
이전에 스크립트에서는 다음과 같이 $startpos 및 $endpos를 얻기 위한 목표 값을 찾기 위해 $pos 계산을 사용했습니다.
chrname="NC_056442.1" # column 1 in pulled file
startpos=7754657 # calculated in prior script
endpos=7982610 # calculated in prior script
start=${chrname}_${startpos} # this was an attempt to simplify the awk command
end=${chrname}_${endpos}
awk -v s="$start" -v e-"$end" '/s/,/e/' file.txt > cut_file.txt
아래 그림과 같이 수동으로 값을 입력하면 5~8줄만 포함된 파일이 나옵니다.
awk '/NC_056442.1_7754657/,/NC_056442.1_7982610/' file.txt > cut_file.txt
결과물 파일
NC_056442.1_7754657 1 2 0.000000 0.199997 0.800003 0.888891
NC_056442.1_7754711 2 0 0.888891 0.111109 0.000000 0.800002
NC_056442.1_7982565 0 1 0.800003 0.199997 0.000000 0.666580
NC_056442.1_7982610 1 0 0.800003 0.199997 0.000000 0.000000
s 및 e 변수를 실제로 작동시키는 방법을 모르기 때문에 어려움을 겪고 있습니다. "ENVIRON[]"을 포함한 다양한 옵션을 시도했습니다. Bash를 처음 접하고 여기에 첫 번째 게시물을 올리기 때문에 이 문제를 해결하는 방법을 모르겠습니다. 나는 awk 이외의 답변에 열려 있습니다. 질문을 수정하거나 정보를 더 추가해야 할 경우 알려주시기 바랍니다.
답변1
정규식을 일치시켜 이를 수행하려고 하지 마십시오. 대신 _
awk의 필드 구분 기호로 또는 공백을 사용하면 사용하기 쉬운 변수에서 염색체와 위치를 얻을 수 있습니다.
start=1234567
end=7654321
awk -v s="$start" -v e="$end" -F '[ _]' '$3 >= s && $3 <= e' file.txt > cut_file.txt
또한 쉘 스크립트에서 변수 이름에 대문자를 사용하지 마십시오. 관례적으로 전역 환경 변수는 대문자이므로 자체 변수에 대문자를 사용하면 이름 지정 충돌이 발생하고 오류를 발견하기 어려울 수 있습니다.
이제 사용 중인 루프를 표시하지 않았습니다. 그것이 무엇이든, 쉘보다는 awk 자체에서 루핑하는 것이 더 좋습니다. 쉘 루프는느린.