이 awk 명령이 출력을 두 번 인쇄하는 이유는 무엇입니까?

이 awk 명령이 출력을 두 번 인쇄하는 이유는 무엇입니까?

두 개의 열 파일을 세 개의 열 파일로 변환하기 위해 awk에 한 줄을 작성하려고 합니다.

즉, 캐릭터 이름 & 시작 위치 --> 캐릭터 이름 & if (Start>2000) then start -2000 else 0 & 시작 위치;

그래서 다음 명령을 썼습니다.

for i in `ls *.startlist`; do 
name=`basename $i .startlist`; 
awk -vOFS="\t" '{for (i=1; i<= NF; i++) { if($2 < 2000) { print $1,0,$2} else {print $1,$2-2000,$2 } }}' $i >${name}_promoter.bed; 
done

그러나 이것은 각 줄을 두 번 인쇄합니다. 버그를 제기할 수 있나요? 그리고 더 좋고 빠른 방법이 있으면 제안해 주세요.

답변1

행당 NF 변환을 실행하고 있습니다. 입력에는 두 개의 필드가 있으므로 출력의 각 줄이 두 배로 늘어납니다.

for 루프를 완전히 제거하고 결과가 예상한 것과 같은지 확인하세요.

답변2

입력 파일에 두 개의 열이 있는 경우 각 레코드에는 두 개의 필드가 있으며(NF는 2) print가 호출될 때마다 i=1 및 i=2에 대해 for 루프가 실행됩니다.

'{for (i=1; i<= NF; i++) { if($2 < 2000) { print $1,0,$2} else {print $1,$2-2000,$2 } }}'

루프를 제거하면 됩니다.

관련 정보