Comment imprimer la troisième colonne à la dernière colonne?
-
05-07-2019 - |
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.
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}'
awk '{ print substr($0, index($0,$3)) }'
solution trouvée ici:
http: //www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
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>