![이 awk 명령이 출력을 두 번 인쇄하는 이유는 무엇입니까?](https://linux55.com/image/107161/%EC%9D%B4%20awk%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%91%90%20%EB%B2%88%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
두 개의 열 파일을 세 개의 열 파일로 변환하기 위해 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 } }}'
루프를 제거하면 됩니다.