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
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
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.
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
Vous pouvez utiliser Bash pour cela:
while read -a cols; do echo ${cols[@]:0:1} ${cols[@]:1,-1}; done < file.txt
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-