web-dev-qa-db-fra.com

supprimer une colonne avec awk ou sed

J'ai un fichier avec trois colonnes. Je voudrais supprimer la 3ème colonne (édition sur place). Comment puis-je faire cela avec awk ou sed?

123   abc  22.3
453   abg  56.7
1236  hjg  2.3

Sortie désirée

123  abc
453  abg
1236 hjg 
33
user2160995

Cela pourrait fonctionner pour vous (GNU sed):

sed -i -r 's/\S+//3' file

Si vous souhaitez supprimer l'espace blanc avant le 3ème champ:

sed -i -r 's/(\s+)?\S+//3' file
16
potong

essayez cette petite chose:

awk '!($3="")' file
51
Kent

Avec GNU awk pour l'édition in-situ, \s/\S et gensub() to delete

1) le champ FIRST:

awk -i inplace '{sub(/^\S+\s*/,"")}1' file

ou

awk -i inplace '{$0=gensub(/^\S+\s*/,"",1)}1' file

2) le dernier champ:

awk -i inplace '{sub(/\s*\S+$/,"")}1' file

ou

awk -i inplace '{$0=gensub(/\s*\S+$/,"",1)}1' file

3) le Nth champ où N = 3:

awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file

Sans GNU awk, vous avez besoin d'un combo match() + substr() ou de plusieurs sub()s + vars pour supprimer un champ du milieu. Voir aussi Imprimer toutes les colonnes sauf les trois premières .

26
Ed Morton

Il semble que vous pourriez simplement aller avec

awk '{print $1 " " $2}' file

Ceci imprime les deux premiers champs de chaque ligne de votre fichier d’entrée, séparés par un espace.

12
tonio

GNU awk 4.1

awk -i inplace NF--

Cela supprimera le dernier champ de chaque ligne.

7
Steven Penny

Essaye ça :

awk '$3="";1' file.txt > new_file && mv new_file file.txt

ou

awk '{$3="";print}' file.txt > new_file && mv new_file file.txt
7
Gilles Quenot

Essayez d'utiliser cut ... c'est rapide et facile

D'abord, vous avez des espaces répétés, vous pouvez les réduire à un seul espace entre les colonnes si c'est ce que vous voulez avec tr -s ' '

Si chaque colonne ne contient déjà qu'un seul séparateur, vous pouvez utiliser cut -d ' ' -f-2 pour imprimer les champs (colonnes) <= 2.

par exemple, si vos données sont dans un fichier input.txt, vous pouvez effectuer l’une des opérations suivantes:

cat input.txt | tr -s ' ' | cut -d ' ' -f-2

Ou si vous avez une meilleure raison de résoudre ce problème en supprimant la 3ème colonne, vous pouvez écrire ce qui suit

cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3

cut est assez puissant, vous pouvez également extraire des plages d'octets ou de caractères, en plus des colonnes

extrait de la page de manuel sur la syntaxe pour spécifier la plage de liste

Each LIST is made up of one range, or many ranges separated by commas.
Selected input is written in the same order that it is read, and is
written exactly once. Each range is one of:

  N     N'th byte, character or field, counted from 1
  N-    from N'th byte, character or field, to end of line
  N-M   from N'th to M'th (included) byte, character or field
  -M    from first to M'th (included) byte, character or field

de sorte que vous auriez également pu dire que vous souhaitiez des colonnes spécifiques 1 et 2 avec ...

cat input.txt | tr -s ' ' | cut -d ' ' -f1,2
0
Jon