comment supprimer les deux premières colonnes dans un fichier en utilisant shell (awk, sed, peu importe)

J’ai un fichier avec plusieurs lignes dans chaque ligne, il y a beaucoup de colonnes (champs) séparées par un blanc “” les nombres de colonnes dans chaque ligne sont différents Je veux supprimer les deux premières colonnes comment faire?

Vous pouvez le faire avec la cut :

 cut -d " " -f 3- input_filename > output_filename 

Explication:

  • cut : invoque la commande cut
  • -d " " : utiliser un seul espace comme délimiteur ( cut utilise TAB par défaut)
  • -f : spécifier les champs à conserver
  • 3- : tous les champs commençant par le champ 3
  • input_filename : utilisez ce fichier comme entrée
  • > output_filename : écrivez la sortie dans ce fichier.

Sinon, vous pouvez le faire avec awk :

 awk '{$1=""; $2=""; sub(" ", " "); print}' input_filename > output_filename 

Explication:

  • awk : invoque la commande awk
  • $1=""; $2=""; : définir les champs 1 et 2 sur la chaîne vide
  • sub(...); : nettoie les champs de sortie car les champs 1 et 2 seront toujours délimités par “”
  • print : imprimer la ligne modifiée
  • input_filename > output_filename : idem que ci-dessus.

Voici une façon de le faire avec Awk qui est relativement facile à comprendre:

 awk '{print substr($0, index($0, $3))}' 

C’est une commande awk simple sans modèle, donc l’action à l’intérieur de {} est exécutée pour chaque ligne d’entrée.

L’action consiste simplement à imprimer la sous-chaîne en commençant par la position du 3ème champ.

  • $0 : toute la ligne de saisie
  • $3 : 3ème champ
  • index(in, find) : retourne la position de find in ssortingng in
  • substr(ssortingng, start) : retourne une sous-chaîne commençant au start index

Si vous souhaitez utiliser un délimiteur différent, tel qu’une virgule, vous pouvez le spécifier avec l’option -F:

 awk -F"," '{print substr($0, index($0, $3))}' 

Vous pouvez également opérer cela sur un sous-ensemble des lignes d’entrée en spécifiant un modèle avant l’action dans {} . Seules les lignes correspondant au modèle auront l’action exécutée.

 awk 'pattern{print substr($0, index($0, $3))}' 

Où modèle peut être quelque chose comme:

  • /abcdef/ : utilise une expression régulière, opère sur $ 0 par défaut.
  • $1 ~ /abcdef/ : opère sur un champ spécifique.
  • $1 == blabla : utilise la comparaison de chaînes
  • NR > 1 : utiliser le numéro d’enregistrement / ligne
  • NF > 0 : utiliser le numéro de champ / colonne

Merci d’avoir posté la question. J’aimerais aussi append le script qui m’a aidé.

 awk '{ $1=""; print $0 }' file 
 awk '{$1=$2="";$0=$0;$1=$1}1' 

Consortingbution

 abcd 

Sortie

 cd 

Vous pouvez utiliser sed :

 sed 's/^[^ ][^ ]* [^ ][^ ]* //' 

Cette option recherche les lignes commençant par un ou plusieurs espaces vides, un espace vide, un autre ensemble d’un ou plusieurs espaces vides et un autre espace vierge, et supprime le matériau correspondant, à savoir les deux premiers champs. Le [^ ][^ ]* est légèrement plus court que la notation équivalente mais plus explicite [^ ]\{1,\} , et le second risque de rencontrer des problèmes avec GNU sed (si vous utilisez l’option --posix , même GNU sed ne peut pas le foutre). OTOH, si la classe de caractères à répéter était plus complexe, la notation numérotée est gagnante. Il est facile d’étendre cela pour gérer «blanc ou onglet» comme séparateur, ou «plusieurs blancs» ou «plusieurs blancs ou tabulations». Il pourrait également être modifié pour gérer les blancs (ou les tabulations) optionnels avant le premier champ, etc.

Pour awk et cut , voir la réponse de Sampson-Chen . Il y a d’autres façons d’écrire le script awk , mais elles ne sont pas sensiblement meilleures que la réponse donnée. Notez que vous devrez peut-être définir explicitement le séparateur de champs ( -F" " ) dans awk si vous ne souhaitez pas que les tabs soient traités comme des séparateurs ou que vous ayez plusieurs espaces entre les champs. La cut standard POSIX ne prend pas en charge plusieurs séparateurs entre les champs; GNU cut a l’option utile mais non standard -i pour permettre plusieurs séparateurs entre les champs.

Vous pouvez aussi le faire en shell pure:

 while read junk1 junk2 residue do echo "$residue" done < in-file > out-file 

C’est assez simple de le faire avec seulement la shell

 while read ABC; do echo "$C" done < oldfile >newfile 

perl:

 perl -lane 'print join(' ',@F[2..$#F])' File 

awk:

 awk '{$1=$2=""}1' File 

Cela pourrait fonctionner pour vous (GNU sed):

 sed -r 's/^([^ ]+ ){2}//' file 

ou pour les colonnes séparées par un ou plusieurs espaces blancs:

 sed -r 's/^(\S+\s+){2}//' file 

Utilisez kscript

 kscript 'lines.split().select(-1,-2).print()' file 

En utilisant awk, et basé sur certaines des options ci-dessous, l’utilisation d’une boucle for rend un peu plus flexible; parfois je peux vouloir supprimer les 9 premières colonnes (si je fais un “ls -lrt” par exemple), donc je change le 2 pour un 9 et c’est tout:

awk '{ for(i=0;i++<2;){$i=""}; print $0 }' your_file.txt