Je veux supprimer un ou plusieurs numéros de ligne spécifique d’un fichier. Comment puis-je faire cela en utilisant sed ?
Réponses
Trop de publicités?
amit
Points
11
ghostdog74
Points
86060
Matthew Slattery
Points
21628
Hastur
Points
560
Je voudrais proposer une généralisation avec awk.
Lorsque le fichier est faite par des blocs de taille fixe et les lignes à supprimer sont répétées pour chaque bloc, awk peut fonctionner de manière
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
Dans cet exemple, la taille du bloc est de 2000 et je veux imprimer les lignes de [1..713] et [1026..1029].
-
NR
est la variable utilisée par awk pour stocker le numéro de ligne courant. -
%
donne le reste (ou module) de la division de deux nombres entiers; -
nl=((NR-1)%BLOCKSIZE)+1
Ici nous écrire dans la variable nl le numéro de la ligne à l'intérieur du bloc courant. (voir ci-dessous) -
||
et&&
sont l'opérateur logique OU et ET. -
print $0
écrit la totalité de la gamme
Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+