매우 큰 파일이 있습니다(아래 스니펫). 첫 번째 열의 숫자가 위 행에서 연속적으로 증가하지 않는 행을 제거해야 합니다.
예를 들어, 첫 번째 열의 식별자가 " 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을 더한 값과 같으면 true입니다. 요약하면 이는 대상 라인이 정의된 "이것이 마지막 행이거나 첫 번째 필드가 마지막 + 1과 같은 경우"를 의미합니다.print; last=$1
: 위의 두 조건 중 하나가 true인 경우 행을 인쇄하고 값을last
첫 번째 필드에 설정합니다.이것좋아요, 그럼 다음 작업을 진행하겠습니다.