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