![큰 파일에서 첫 번째 필드/열이 반복되는 줄 제거](https://rvso.com/image/164735/%ED%81%B0%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%ED%95%84%EB%93%9C%2F%EC%97%B4%EC%9D%B4%20%EB%B0%98%EB%B3%B5%EB%90%98%EB%8A%94%20%EC%A4%84%20%EC%A0%9C%EA%B1%B0.png)
매우 큰 파일이 있습니다(아래 스니펫). 첫 번째 열의 숫자가 위 줄에서 연속적으로 증가하지 않는 줄을 제거해야 합니다.
예를 들어, 첫 번째 열의 식별자가 " "인 스니펫의 첫 번째 줄을 유지하고 싶습니다 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
)가 변수에 저장된 값에last
1을 더한 값과 같으면 참이 됩니다. 종합하면 이는 "이것이 마지막 줄이거나 첫 번째 필드가 마지막 + 1과 같은 경우"를 의미합니다. 목표 라인을 정의합니다.print; last=$1
: 위에서 설명한 두 가지 조건 중 하나가 true인 경우 행을 인쇄하고 값을last
첫 번째 필드로 설정합니다.이것다음을 처리할 수 있도록 합니다.