2010-06-15 3 views
11

$ $ je le fichier suivant et je dois imprimer tout sauf $1 et $2 par awkawk + Besoin d'imprimer tout (tous les champs de repos), sauf 1 et 2

fichier:

INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 
... 

désirable sortie:

12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
... 
+0

duplication possible de [Utilisation de awk pour imprimer toutes les colonnes de la nième à la dernière] (http: // stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-du-n-au-dernier) – Andy

Répondre

11
$ cat t 
INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 

$ awk '{for (i = 3; i <= NF; i++) printf $i " "; print ""}' t 
12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
+2

Même si pour la question en cours il y a plus simple que awk (voir ci-dessous), si vous avez Pour faire un peu de calcul sur vos données, il est très utile de connaître votre boucle! Un de mes collègues a dû effectuer des ajouts sur les deux premières colonnes et ensuite imprimer les autres en l'état: un simple bloc printf suivi de votre bloc a fait l'affaire. Merci pour la réponse (que j'ai ajouté :-)). –

18

Eh bien, compte tenu de votre données, coupe doit être suffisante:

cut -d\ -f3- infile 
3

danbens réponse laisse des espaces à la fin de la chaîne résultante. de sorte que la bonne façon de le faire serait:

awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' filename 
+0

bonne attention aux détails ... +1 pour cela :) –

+1

awk '{pour (i = 3; i

0

Voici une autre solution awk, qui est plus souple que le cut un et est plus courte que les autres awk les. En supposant que vos séparateurs sont des espaces uniques (modifier l'expression régulière que nécessaire si elles ne sont pas):

awk --posix '{sub(/([^ ]*){2}/, ""); print}' 
9

Bien qu'il ajoute un espace supplémentaire au début de chaque ligne par rapport à la production prévue de yael, voici une awk plus courte et plus simple solution que celles précédemment proposées:

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

ou même:

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

excellente solution! – inselberg

+1

Si vous voulez éviter les espaces de tête, vous pouvez faire 'awk '{$ 1 = $ 2 =" "; $ 0 = $ 0; $ 1 = $ 1} 1' fichier' – user000001

1

Si les deux premiers mots ne changent pas, sans doute la chose la plus simple serait:

awk -F 'INFORMATION DATA ' '{print $2}' t 
0

Si Perl est une option:

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

Ces options de ligne de commande sont utilisées:
boucle -n autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement
-l supprime les nouvelles lignes avant le traitement, et les rajoute par la suite
-a mode de redécoupage automatique - diviser les lignes d'entrée dans le tableau @F. Par défaut, le fractionnement sur des espaces
-e exécuter le code perl

splice @F,0,2 supprime proprement les colonnes 0 et 1 du tableau @F
join " ",@F jointures des éléments du tableau @F, en utilisant un espace entre chaque élément

variation des fichiers d'entrée csv:

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

Il utilise l'op séparateur de champ -F avec une virgule

Questions connexes