awk에서 구문 분석/조작

awk에서 구문 분석/조작

저는 프로그래밍이 처음입니다 awk. 텍스트 파일 조작에 대한 질문이 있는데 시각화 소프트웨어(Circos)를 사용해야 합니다.http://circos.ca)

해당 값을 처리하는 데 사용하려는 입력 데이터가 있습니다 awk/grep/sed. 총 9쌍(18라인)이 있습니다. 5쌍(처음 10줄)은 "from=ABCB11"에 대한 것이고 4쌍(다음 8줄)은 "from =ABCC8"에 대한 것입니다. 첫 번째 쌍의 첫 번째 행에서 값을 추출하고 나머지 쌍의 각 교대 행에서 값을 바꾸고 싶습니다. 따라서 그룹 2의 값은 9 10이며 이는 그룹 2의 모든 값을 대체해야 합니다. 그룹 2의 다음 값은 28 29이며 9 10으로 대체되어야 합니다.

정류장은 "from=name", 즉 "from=ABCB11"으로 결정되어야 합니다. 표현식이 캡처되어 다음 발생부터 대체되어야 하는 행은 이 예에서처럼 그룹 2에 속할 필요가 없습니다. 3~4그룹부터 10그룹까지 가능합니다. 따라서 두 번째 그룹("from=ABCC8")은 그룹 4/5/6에 속할 수 있지만 반드시 그룹 2에 속할 필요는 없습니다. 우연의 일치일 뿐이지만 "from=" 대체 줄마다 모든 그룹 번호가 동일합니다.

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 28 29 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 29 30 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 10 11 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 11 12 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

내가 찾고 있는 최종 결과는 다음과 같습니다.

group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1

또한 이는 단지 샘플 데이터일 뿐입니다. 많은 쌍에는 그룹 1, 그룹 4, 그룹 5 및 최대 그룹 10이 있습니다. 여기서는 소규모 그룹 쌍만 언급됩니다.

기본적으로 이는 각 대체 줄의 "from=ABCB11" 끝까지 전체 줄을 인쇄할 때 확인해야 하는 수정 사항입니다. "from=ABCC8"의 경우에도 마찬가지입니다.

group-2 9 10
group-3 0 1
group-2 9 10
group-5 0 1
group-2 9 10
.........
.........
.........

내가 시도한 것은 다음과 같습니다.

각 대체 행의 모든 ​​항목을 변경할 수 있도록 "from = name"의 값이 동일하게 유지될 때까지 행을 반복하고 싶습니다. 암호:

awk -F, 'NR%2==1 {split($2,a,"="); print a[2]}' file.txt

위 코드는 "from=name"에서 대체 행과 "name"을 추출할 수 있습니다.

답변1

다음과 같이 시도해 보세요:

awk 'NR%2{if(p!=$2){v=$1; p=$2}$1=v}1' FS=, OFS=, file

$2이는 변경되었는지 테스트 하고 $1모든 홀수 행을 모든 홀수 행에서 동일한 값으로 바꿉니다.$2


설명이 추가되었습니다..

awk '
  NR%2 {            # On every line where NR (recordnr) mod 2 equals 1 (odd line)
    if(p!=$2) {     # If the variable p (previous) is different from the 2nd field then
      v=$1          # The new value v should become $1 (1st field)
      p=$2          # The new variable p becomes the current field 2
    }               #
    $1=v            # On every odd line field 1 becomes the previously set value
  }
  1                 # 1 means true. The default action is to print the record (line)
' FS=, OFS=, file   # Set the input and output field separators to a comma.

관련 정보