web-dev-qa-db-fra.com

Comment imprimer la troisième colonne à la dernière colonne?

J'essaie de supprimer les deux premières colonnes (dont je ne suis pas intéressé) 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. 

94
Amit G

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

93
Marcin
awk '{for(i=3;i<=NF;++i)print $i}' 
95
Jonathan Feinberg
89
daisaa

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
31
Dennis Williamson
awk '{$1=$2=$3=""}1' file

NB: cette méthode laissera des "blancs" dans les champs 1, 2, 3, mais ce n’est pas un problème si vous voulez seulement regarder la sortie.

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

Cela coupe ce qui se trouve avant le numéro de champ donné, N, et imprime tout le reste de la ligne, y compris le champ n.N et en maintenant 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 de fin

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 voulez 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.

8
Robert Vila

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

Il 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 on peut le constater, la fiche de paie, même avec de l'espace, s'affiche dans la ligne correcte.

5
Brother

Qu'en est-il de la ligne suivante:

awk '{$ 1 = $ 2 = $ 3 = ""; imprimer le fichier

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

awk '/ ^ exim4-config/{$ 1 = ""; imprimer le fichier
5
Wawrzek

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"); }'

Vous trouverez 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
4
funk

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 }'
3
Eddie Sullivan
awk '{a=match($0, $3); print substr($0,a)}'

Vous trouvez d’abord 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. 

2
Mitchjol

Dans Bash, vous pouvez utiliser la syntaxe suivante avec des 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 Bash Hackers Wiki

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

imprime les enregistrements à partir du 4ème champ jusqu'au dernier champ dans le même ordre qu'ils étaient dans le fichier d'origine

1
Massimo

Un peu tard ici, mais rien de ce qui précède ne semblait fonctionner. Essayez ceci en utilisant printf, insérez 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) }'
1
Ross
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

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

0
sjas

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 le font certaines des réponses ci-dessus):

awk '{gsub($1" "$2" ",""); print;}' file
0
champost