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