![Entfernen Sie Zeilen mit wiederholtem ersten Feld/Spalte aus einer großen Datei](https://rvso.com/image/164735/Entfernen%20Sie%20Zeilen%20mit%20wiederholtem%20ersten%20Feld%2FSpalte%20aus%20einer%20gro%C3%9Fen%20Datei.png)
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, 40814
und 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 awk
sich 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)
:NR
ist die aktuelle Zeilennummer.NR == 1
Ist also nur wahr, wenn die erste Zeile der Datei gelesen wird. Wir brauchen das, damit wir immer die erste Zeile drucken.$1 == last +1
Ist dann wahr, wenn das erste Feld der Zeile ($1
) dem in der Variablen gespeicherten Wertlast
plus 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 Wertlast
als erstes Feld vonDasZeile, damit wir die nächste verarbeiten können.