큰 파일에서 첫 번째 필드/열이 반복되는 줄 제거

큰 파일에서 첫 번째 필드/열이 반복되는 줄 제거

매우 큰 파일이 있습니다(아래 스니펫). 첫 번째 열의 숫자가 위 줄에서 연속적으로 증가하지 않는 줄을 제거해야 합니다.

예를 들어, 첫 번째 열의 식별자가 " "인 스니펫의 첫 번째 줄을 유지하고 싶습니다 40812. 그런 다음 40813첫 번째 열(예제에서는 3번째 줄)에 " "가 있는 행과 " "로 시작하는 행을 유지하고 싶습니다 40814. 두 번째 행과 같이 이 연속을 위반하는 줄을 삭제하고 싶습니다.

가능한 해결책에 대한 이전 질문/답변을 여기에서 살펴봤지만 지금까지 성공하지 못했습니다. 여러 질문에 나타난 해결책은 다음과 같습니다.

awk -F',' ' '!seen[$1]++ myFile

나는 다음과 같은 또 다른 솔루션을 적용했습니다.

sort -t':' -k 1,1 -u myFile

누구든지 내가 어디에서 잘못되고 있는지 말해 주시면 매우 감사하겠습니다. 나는 파일 조작에 대한 경험이 많지 않습니다.

 40812        20406.000000         0.843859468      1083.209050130      -994.562279080      -993.349611938        22.120868921
 40829        20414.500000         0.891283743      1144.084593627      -994.539001565      -993.349739827        21.177788019
 40813        20406.500000         0.829362077      1064.599666089      -994.546948121      -993.348764740        22.087239027
 40830        20415.000000         0.889606427      1141.931529727      -994.537943593      -993.350242614        21.282490969
 40814        20407.000000         0.822524589      1055.822814442      -994.540118434      -993.348757318        22.083606005
 40831        20415.500000         0.875230513      1123.478077086      -994.523844766      -993.350421831        20.606467962
 40815        20407.500000         0.823511602      1057.089780943      -994.541681744      -993.349315083        22.432111979
 40832        20416.000000         0.846150258      1086.149592126      -994.494220141      -993.349798791        22.309054136
 40816        20408.000000         0.824550451      1058.423286012      -994.543159511      -993.349731194        22.481428146
 40833        20416.500000         0.811604775      1041.805740021      -994.458563132      -993.348626225        21.118428946
 40834        20417.000000         0.787796672      1011.244783236      -994.434062658      -993.347887110        20.963790894
 40817        20408.500000         0.819160081      1051.504008955      -994.537767061      -993.349702160        22.268819809
 40835        20417.500000         0.784857495      1007.471947645      -994.431441227      -993.348167742        20.731789112
 40818        20409.000000         0.807571275      1036.628191427      -994.525675417      -993.349169067        22.332761049
 40836        20418.000000         0.799208319      1025.893192994      -994.446595759      -993.348938468        21.268665075
 40819        20409.500000         0.797104599      1023.192780242      -994.514563564      -993.348491176        22.622548103
 40837        20418.500000         0.819797939      1052.322786256      -994.467698852      -993.349417295        21.013041973
 40820        20410.000000         0.796605925      1022.552664951      -994.513928312      -993.348319789        22.193170071

답변1

이것은 정확히 다음과 같은 분야 awk에서 탁월한 것입니다.

$ awk '{ if(NR==1 || $1 == last+1){print; last=$1}}' file
 40812        20406.000000         0.843859468      1083.209050130      -994.562279080      -993.349611938        22.120868921
 40813        20406.500000         0.829362077      1064.599666089      -994.546948121      -993.348764740        22.087239027
 40814        20407.000000         0.822524589      1055.822814442      -994.540118434      -993.348757318        22.083606005
 40815        20407.500000         0.823511602      1057.089780943      -994.541681744      -993.349315083        22.432111979
 40816        20408.000000         0.824550451      1058.423286012      -994.543159511      -993.349731194        22.481428146
 40817        20408.500000         0.819160081      1051.504008955      -994.537767061      -993.349702160        22.268819809
 40818        20409.000000         0.807571275      1036.628191427      -994.525675417      -993.349169067        22.332761049
 40819        20409.500000         0.797104599      1023.192780242      -994.514563564      -993.348491176        22.622548103
 40820        20410.000000         0.796605925      1022.552664951      -994.513928312      -993.348319789        22.193170071

또는 약간의 골프를 쳤습니다.

$ awk '(NR==1 || $1 == last+1) && last=$1' file
 40812        20406.000000         0.843859468      1083.209050130      -994.562279080      -993.349611938        22.120868921
 40813        20406.500000         0.829362077      1064.599666089      -994.546948121      -993.348764740        22.087239027
 40814        20407.000000         0.822524589      1055.822814442      -994.540118434      -993.348757318        22.083606005
 40815        20407.500000         0.823511602      1057.089780943      -994.541681744      -993.349315083        22.432111979
 40816        20408.000000         0.824550451      1058.423286012      -994.543159511      -993.349731194        22.481428146
 40817        20408.500000         0.819160081      1051.504008955      -994.537767061      -993.349702160        22.268819809
 40818        20409.000000         0.807571275      1036.628191427      -994.525675417      -993.349169067        22.332761049
 40819        20409.500000         0.797104599      1023.192780242      -994.514563564      -993.348491176        22.622548103
 40820        20410.000000         0.796605925      1022.552664951      -994.513928312      -993.348319789        22.193170071

설명

  • if(NR==1 || $1 == last+1): NR현재 줄 번호입니다. 따라서 NR == 1파일의 첫 번째 줄을 읽는 동안에만 해당됩니다. 이것이 필요하므로 항상 첫 번째 줄을 인쇄합니다. 그런 다음 $1 == last +1줄의 첫 번째 필드( $1)가 변수에 저장된 값에 last1을 더한 값과 같으면 참이 됩니다. 종합하면 이는 "이것이 마지막 줄이거나 첫 번째 필드가 마지막 + 1과 같은 경우"를 의미합니다. 목표 라인을 정의합니다.
  • print; last=$1: 위에서 설명한 두 가지 조건 중 하나가 true인 경우 행을 인쇄하고 값을 last첫 번째 필드로 설정합니다.이것다음을 처리할 수 있도록 합니다.

관련 정보