Entfernen Sie Zeilen mit wiederholtem ersten Feld/Spalte aus einer großen Datei

Entfernen Sie Zeilen mit wiederholtem ersten Feld/Spalte aus einer großen Datei

Ich habe eine sehr große Datei (Ausschnitt unten). Ich muss alle Zeilen entfernen, bei denen die Zahl in der ersten Spalte nicht fortlaufend von der Zeile darüber an ansteigt.

Ich möchte beispielsweise die erste Zeile aus meinem Snippet behalten, in der der Bezeichner in der ersten Spalte „ 40812“ lautet. Dann möchte ich die Zeile beibehalten, in der „ 40813“ in der ersten Spalte steht (Zeile 3 in meinem Beispiel) und dann die Zeile, die mit „“, beginnt, 40814und so weiter. Ich möchte alle Zeilen löschen, die diese Reihenfolge verletzen, beispielsweise die zweite Zeile.

Ich habe mir hier frühere Fragen/Antworten nach möglichen Lösungen angesehen und war bisher erfolglos. Eine Lösung, die in mehreren Fragen auftaucht, ist:

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

Ich habe eine andere Lösung angepasst, die ich wie folgt sah:

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

Ich wäre sehr dankbar, wenn mir jemand sagen könnte, was ich falsch gemacht habe. Ich habe nicht viel Erfahrung mit der Dateibearbeitung.

 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

Antwort1

Genau das ist es, was awksich auszeichnet durch:

$ 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

Oder ein bisschen Golf gespielt:

$ 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

Erläuterung

  • if(NR==1 || $1 == last+1): NRist die aktuelle Zeilennummer. NR == 1Ist also nur wahr, wenn die erste Zeile der Datei gelesen wird. Wir brauchen das, damit wir immer die erste Zeile drucken. $1 == last +1Ist dann wahr, wenn das erste Feld der Zeile ( $1) dem in der Variablen gespeicherten Wert lastplus 1 entspricht. Zusammengenommen bedeutet dies „wenn dies die letzte Zeile ist oder wenn das erste Feld gleich last + 1 ist“, was Ihre Zielzeilen definiert.
  • print; last=$1: Wenn eine der beiden oben erläuterten Bedingungen zutrifft, drucken Sie die Zeile und setzen Sie den Wert lastals erstes Feld vonDasZeile, damit wir die nächste verarbeiten können.

verwandte Informationen