web-dev-qa-db-fra.com

Comment couper les n premières et les n dernières colonnes?

Comment puis-je couper les premières n et les dernières n colonnes d'un fichier délimité par des tabulations?

J'ai essayé cela pour couper en premier n colonne. Mais je n'ai aucune idée de combiner la première et la dernière colonne n

cut -f 1-10 -d "<CTR>v <TAB>" filename
63
haluk

Cut peut prendre plusieurs plages dans -f:

Colonnes jusqu'à 4 et à partir de 7: 

cut -f -4,7-

ou pour les champs 1,2,5,6 et à partir de 10:

cut -f 1,2,5,6,10-

etc

92
kauppi

Pour utiliser AWK pour couper le premier et le dernier champs:

awk '{$1 = ""; $NF = ""; print}' inputfile

Malheureusement, cela laisse les séparateurs de champ, donc

aaa bbb ccc

devient

[space]bbb[space]

Pour ce faire, utilisez la réponse de kurumi qui ne laissera pas d'espaces supplémentaires, mais d'une manière qui soit spécifique à vos besoins:

awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

Cela corrige également quelques problèmes dans cette réponse.

Pour généraliser cela:

awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile

Ensuite, vous pouvez modifier le nombre de champs à ignorer au début ou à la fin en modifiant les affectations de variables au début de la commande.

1
Dennis Williamson

La première partie de votre question est facile. Comme déjà indiqué, cut accepte l'omission de l'index de début ou de fin d'une plage de colonnes, en interprétant cela comme signifiant «du début à la colonne n (inclus)» ou «de la colonne n (inclus) jusqu'à la fin », respectivement:

$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test

Il prend également en charge les gammes combinant. Si vous voulez, par exemple, les 3 premières et les 2 dernières colonnes d'une rangée de 7 colonnes:

$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz

Cependant, la deuxième partie de votre question peut être un peu plus délicate en fonction du type de contribution que vous attendez. Si vous entendez par "dernières n colonnes", vous entendez "dernières n colonnes (quels que soient leurs indices dans la ligne globale)" (c'est-à-dire parce que vous ne savez pas nécessairement combien de colonnes vous allez trouver à l’avance), ce n’est malheureusement pas possible de le faire avec cut seul. Pour utiliser efficacement cut afin d'extraire «les dernières n colonnes» de chaque ligne, le nombre total de colonnes présentes dans chaque ligne doit être connu à l'avance,etchaque ligne doit être cohérente dans le nombre de colonnes qu'elle contient.

Si vous not savez combien de «colonnes» peuvent être présentes dans chaque ligne (par exemple, parce que vous utilisez une entrée non strictement tabulaire), vous devrez alors utiliser quelque chose comme awk. Par exemple, utiliser awk pour extraire les 2 dernières "colonnes" (awk les appelle champs, dont le nombre peut varier par ligne) à partir de chaque ligne d'entrée:

$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d
0
Mark G.

Vous pouvez utiliser Bash pour cela:

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

Vous pouvez couper en utilisant ce qui suit,
- d: délimiteur, -f pour les champs
\t utilisé pour les champs séparés par des tabulations

cut -d$'\t' -f 1-3,7-
0
Saurabh