Comment remplacer la place vide par le contenu de la ligne suivante dans le script shell

1,n1,abcd,1234 2,n2,abrt,5666 ,h2,yyyy,123x 3,h2,yyyy,123y 3,h2,yyyy,1234 ,k1,yyyy,5234 4,22,yyyy,5234 

la donnée ci-dessus est mon fichier d’entrée abc.txt, tout ce que je veux la valeur de la première colonne manquante devrait remplir avec la première valeur de la ligne suivante. Exemple:

 3,h2,yyyy,123x 3,h2,yyyy,123y 

Je veux une sortie comme ci-dessous,

 1,n1,abcd,1234 2,n2,abrt,5666 3,h2,yyyy,123x// the missing first column value 3 should fill with second row first value 3,h2,yyyy,123y 3,h2,yyyy,1234 4,k1,yyyy,5234 4,22,yyyy,5234 

Comment implémenter cela avec l’aide d’AWK ou de tout autre script shell, aidez-nous.

En utilisant awk, vous pouvez faire:

 awk -F, '$1 ~ /^ *$/ { p=p RS $0 next } p!="" { gsub(RS " +", RS $1, p) sub("^" RS, "", p) print p p="" } 1' file 1,n1,abcd,1234 2,n2,abrt,5666 3,h2,yyyy,123x 3,h2,yyyy,123y 3,h2,yyyy,1234 4,k1,yyyy,5234 4,22,yyyy,5234 

Je voudrais inverser le fichier, puis remplacer la valeur de la ligne précédente :

 tac filename | awk -F, '$1 ~ /^[[:blank:]]*$/ {$1 = prev} {print; prev=$1}' | tac 

Cela remplira également les valeurs manquantes sur plusieurs lignes.

Avec GNU sed:

 $ sed '/^ ,/{N;s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/}' infile 1,n1,abcd,1234 2,n2,abrt,5666 3,h2,yyyy,123x 3,h2,yyyy,123y 3,h2,yyyy,1234 4,k1,yyyy,5234 4,22,yyyy,5234 

La commande sed effectue les opérations suivantes:

 /^ ,/ { # If the line starts with 'space comma' N # Append the next line # Extract the value before the comma, prepend to first line s/ \(.*\n\)\([^,]*\)\(.*\)/\2\1\2\3/ } 

BSD sed nécessiterait un point-virgule supplémentaire avant l’accolade de fermeture.

Cela ne fonctionne qu’avec des lignes non contiguës avec des valeurs manquantes.