awk는 조건에 따라 필드에 추가됩니다.

awk는 조건에 따라 필드에 추가됩니다.

아래에서는 사용 된 awk파일의 원래 값에 . $22호선이 대표적이다. 현재의 경우 "배열"(있는 경우)에서 값을 찾아 분할하고 저장하고 그 안에 필드 수를 유지하므로 내 논리가 올바르지 않습니다. 출력 분할에서 카운트를 인쇄할지 여부에 따라 다릅니다. 실제 데이터에는 수백 개의 행이 있을 수 있지만 형식은 항상 동일합니다. 가까워 보이지만 충분하지는 않습니다. 감사해요:).+1$2-inawk$2-numnum

존재하다

chr15 91543131 AAW33B
chr8 100493900-100493909 SBSA

awk '{num=split($2,array,"[ -]");if(num==3){print $1,$2-1,$2,$3};if(num==4){print $1,array[1],array[2],array[2],$3}}' in | column -t

원하다 tab-delimited

chr15   91543130    91543131    AAW33B
chr8    100493900   100493909   SBSA

답변1

다음 입력이 주어지면:

chr15 91543131 AAW33B
chr8 100493900-100493909 SBSA

우리는 간단히 awk사용할 수 있습니다 /[ -]/(예: 공백또는a를 -필드 구분 기호로 사용) 출력 필드 구분 기호로 탭 문자를 제공할 수도 있습니다 awk. 즉, 더 이상 다음이 필요하지 않습니다 column -t.

$ awk 'BEGIN { FS = "[ -]"; OFS="\t" } NF==3 { print $1, $2 - 1, $2, $3 } NF==4 { print $1, $2, $3, $4 }' input
chr15   91543130    91543131    AAW33B
chr8    100493900   100493909   SBSA

또는 필드 구분 기호를 유지하고 두 번째 필드에 다음이 포함되어 있는지 확인할 수 있습니다 -.

$ awk 'BEGIN { OFS="\t" } $2 !~ /-/ { print $1, $2 - 1, $2, $3 } $2 ~ /-/ { split( $2, a, "-" ); print $1, a[1], a[2], $3 }' input
chr15   91543130    91543131    AAW33B
chr8    100493900   100493909   SBSA

관련 정보