Question

J'essaie de supprimer les deux premières colonnes (qui ne m'intéressent pas) d'un fichier journal DbgView. Je n'arrive pas à trouver un exemple imprimant à partir de la colonne 3 jusqu'à la fin de la ligne. Notez que chaque ligne a un nombre variable de colonnes.

Était-ce utile?

La solution

... ou une solution plus simple: cut -f 3- INPUTFILE ajoutez simplement le délimiteur correct (-d) et vous obtiendrez le même effet.

Autres conseils

awk '{for(i=3;i<=NF;++i)print $i}' 
La réponse de

Jonathan Feinberg imprime chaque champ sur une ligne distincte. Vous pouvez utiliser printf pour reconstruire l'enregistrement pour une sortie sur la même ligne, mais vous pouvez également déplacer les champs d'un saut vers la gauche.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file

NB: cette méthode laissera " blancs " dans 1,2,3 champs mais pas un problème si vous voulez juste regarder la sortie.

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Ceci coupe ce qui se trouve avant le numéro de champ donné, N, et affiche tout le reste de la ligne, y compris le numéro de champ.N et le maintien de l'espacement d'origine (il ne reformate pas). Peu importe que la chaîne du champ apparaisse également ailleurs dans la ligne, ce qui pose problème avec la réponse de Daisaa.

Définir une fonction:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

Et utilisez-le comme ceci:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

La sortie conserve tout, y compris les espaces finaux

Fonctionne bien pour les fichiers où '/ n' est le séparateur d'enregistrement, de sorte que vous n'avez pas ce caractère de nouvelle ligne à l'intérieur des lignes. Si vous souhaitez l'utiliser avec d'autres séparateurs d'enregistrement, utilisez:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

par exemple. Fonctionne bien avec presque tous les fichiers tant qu’ils n’utilisent pas le caractère hexadécimal. 1 à l'intérieur des lignes.

Qu'en est-il de la ligne suivante:

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

Basé sur la suggestion de @ ghostdog74. Le mien devrait se comporter mieux lorsque vous filtrez des lignes, c'est-à-dire:

awk '/^exim4-config/ {$1=""; print }' file

Si vous souhaitez imprimer les colonnes après la 3ème par exemple dans la même ligne, vous pouvez utiliser:

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

Par exemple:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

Cela imprimera:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

Comme nous pouvons le constater, la fiche de paie, même avec de l'espace, s'affiche dans la ligne correcte.

La commande awk suivante imprime les N derniers champs de chaque ligne et à la fin de la ligne, un nouveau caractère de ligne:

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

Trouvez ci-dessous un exemple répertoriant le contenu du répertoire / usr / bin, contenant les 3 dernières lignes, puis imprimant les 4 dernières colonnes de chaque ligne à l'aide de awk:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

Eh bien, vous pouvez facilement obtenir le même effet en utilisant une expression régulière. En supposant que le séparateur soit un espace, cela ressemblerait à:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

Solution Perl:

perl -lane 'splice @F,0,2; print join " ",@F' file

Ces options de ligne de commande sont utilisées:

  • -n boucle autour de chaque ligne du fichier d'entrée, n'imprimez pas automatiquement chaque ligne

  • -l supprime les nouvelles lignes avant traitement et les rajoute après

  • -a mode autosplit & # 8211; diviser les lignes d'entrée dans le tableau @F. Fractionner par défaut sur les espaces blancs

  • -e exécuter le code Perl

splice @F,0,2 supprime proprement les colonnes 0 et 1 du tableau @F

join " ",@F joint les éléments du tableau @F en utilisant un espace entre chaque élément

Si votre fichier d'entrée est délimité par des virgules plutôt que par des espaces, utilisez -F, -lane

Solution Python:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

awk '{a=match($0, $3); print substr($0,a)}'

Vous commencez par trouver la position du début de la troisième colonne. Avec substr, vous imprimerez la ligne entière ($ 0) en partant de la position (dans ce cas a) jusqu'à la fin de la ligne.

Un peu tard ici, mais rien de ce qui précède ne semblait fonctionner. Essayez ceci en utilisant printf, insère des espaces entre chaque. J'ai choisi de ne pas avoir de nouvelle ligne à la fin.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

imprime les enregistrements du 4ème au dernier champ dans le même ordre où ils se trouvaient dans le fichier d'origine

Dans Bash, vous pouvez utiliser la syntaxe suivante avec les paramètres de position:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

En savoir plus: Gestion des paramètres de position sur le wiki de Bash Hackers

S'il ne s'agit que d'ignorer les deux premiers champs et si vous ne voulez pas d'espace pour masquer ces champs (comme certaines des réponses ci-dessus le font):

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

Les deux premières colonnes sont effacées, sed supprime les espaces de début.

Dans AWK, les colonnes sont appelées champs, NF est donc la clé

toutes les lignes:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

première ligne uniquement:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top