7 votes

commande awk : si la ligne ne commence pas par un caractère, supprimer la nouvelle ligne sur la ligne précédente

J'essaie d'utiliser la commande awk pour appliquer cette règle : si la ligne ne commence pas par "O|" ou "A|" ou "S|" Je veux supprimer la nouvelle ligne sur la ligne précédente

J'ai ce fichier en entrée (input.txt)

O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2
O|field1|field2
O|field1|
field2
A|field1|
field2
S|field1|
field2
O|field1|field2

Je souhaite obtenir le résultat suivant

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

Exécution de ce code

awk '/^O\|/ || /^A\|/ || /^S\|/ {printf "%s", $0; next} 1 {print}' input.txt > output.txt

Il renvoie

O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2O|field1|field2O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

Quelqu'un peut-il m'aider ?

4voto

anubhava Points 172509

Le présent awk devrait vous convenir :

awk -F'|' 'NF==3 && $3 == "" {p = $0; next}
      {print (NF == 1 ? p $1 : $0); p = ""}' file

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

4voto

RavinderSingh13 Points 29608

Avec les échantillons que vous avez montrés, essayez ce qui suit awk code.

awk '
BEGIN{FS=OFS="|"}
!/\|/ {
  print val,$0
  val=""
  next
}
$0~/\|$/ && NF==3{
  val=$0
  next
}
1
' Input_file

3voto

Ed Morton Points 25374

Une solution de ce type, qui teste la présentation des enregistrements, pourrait vous convenir mieux que de tester les valeurs des champs :

$ awk -v RS='([^|]*[|]){2}[^|]*\n' '{$0=RT; gsub(/\n/,""); print}' file
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

L'exemple ci-dessus utilise GNU awk pour les RS à plusieurs caractères afin de définir un enregistrement comme étant composé de trois champs séparés par des caractères | et se terminant par un saut de ligne, puis supprime tout saut de ligne de chaque enregistrement avant de l'imprimer.

3voto

The fourth bird Points 40138

Vous ne semblez avoir que le problème du dernier champ manquant.

Si le | est le délimiteur de champ, vous pouvez vérifier si le troisième champ n'est pas vide et imprimer la ligne entière.

Imprimer la ligne précédente plus la ligne actuelle si le champ 1 n'est pas A O o S

awk -F'|' '{
  if($1 !~ /^[AOS]$/) { print p $0; next }
  if ($3!="") print $0
  p = $0
}' file

Sortie

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

3voto

karakfa Points 604

Une autre solution

awk -v RS="" '{gsub("\\|\n","|")}1' file

O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2
O|field1|field2
O|field1|field2
A|field1|field2
S|field1|field2
O|field1|field2

traite le fichier comme un long flux et supprime les nouvelles lignes après les tuyaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X