web-dev-qa-db-fra.com

Commande Unix pour tout supprimer après la première colonne

J'ai un fichier texte dans lequel j'ai quelque chose comme ça-

10.2.57.44      56538154    3028
120.149.20.197  28909678    3166
10.90.158.161   869126135   6025

Dans ce fichier texte, j'ai environ 1 000 000 lignes exactement comme ci-dessus. Je travaille dans l'environnement SunOS. J'avais besoin d'un moyen de supprimer tout de ce fichier texte en ne laissant que l'adresse IP (la première colonne du fichier texte ci-dessus est l'adresse IP). Donc, après avoir exécuté une commande unix, le fichier devrait ressembler à quelque chose en dessous. 

10.2.57.44
120.149.20.197
10.90.158.161

Quelqu'un peut-il m'aider s'il vous plaît avec une commande Unix qui peut supprimer tout ce qui ne reste que l'adresse IP (première colonne) et l'enregistrer à nouveau dans un fichier.

Donc, la sortie devrait être quelque chose comme ça dans un fichier-

10.2.57.44
120.149.20.197
10.90.158.161
16
arsenal
 nawk '{print $1}' file > newFile && mv newFile file

OR

 cut -f1 file > newFile && mv newFile file

Comme vous utilisez SunOS, vous voudrez vous familiariser avec nawk (pas awk, qui est la version ancienne et grincheuse de awk, tandis que nawk = new awk ;-).

Dans les deux cas, vous imprimez le premier champ du fichier dans newFile.

(n) awk est un langage de programmation complet conçu pour la manipulation facile de fichiers texte. Le $1 correspond au premier champ de chaque ligne, $ 9 au neuvième champ, etc., tandis que $ 0 correspond à la totalité de la ligne. Vous pouvez dire à (n) awk ce qu'il faut utiliser pour séparer les champs, ce peut être un caractère de tabulation ou un '|' caractère, ou plusieurs espaces. Par défaut, toutes les versions de awk utilisent des espaces, c’est-à-dire plusieurs espaces, ou un onglet pour délimiter les colonnes/champs, par ligne d’un fichier.

Pour une très bonne introduction à awk, voir Page Awk de Grymoire

Le && signifie, n'exécute la commande suivante que si la commande précédente s'est terminée sans problème. De cette façon, vous n'effacerez pas accidentellement votre bon fichier de données, à cause d'une erreur.

IHTH

8
shellter

Si le délimiteur est un caractère d'espacement, utilisez

 cut -d " " -f 1 filename

Si le délimiteur est un caractère de tabulation, l'option -d n'est pas nécessaire car tabulation est le délimiteur par défaut pourcutcommand

cut -f 1 filename

-d Délimiteur; le caractère qui suit immédiatement l'option -d est le délimiteur de champ.

-f Spécifie une liste de champs, séparés par un délimiteur.

19
Mudassir Hasan

Essaye ça

awk '{$1=$1; print $1}' temp.txt

Sortie

10.2.57.44
120.149.20.197
10.90.158.161
1
Mirage

Si vous avez vim, ouvrez le fichier avec. Puis, en mode commande, écrivez pour substitution (tabulation ou espace ou le délimiteur) %s:<delimiter>.*$::g. Maintenant, enregistrez le fichier avec :wq.

Utiliser sed donner une commande comme celle-ci sed -e 's/<delimiter>.*$//' > file.txt

1
Mukund K Roy

Que diriez-vous d'un script Perl;)

#!/usr/bin/Perl -w
use strict;

my $file = shift;
die "Missing file or can't read it" unless $file and -r $file;

sub edit_in_place
{
    my $file       = shift;
    my $code       = shift;
    {
        local @ARGV = ($file);
        local $^I   = '';
        while (<>) {
            &$code;
        }
    }
}

edit_in_place $file, sub {
    my @columns = split /\s+/;
    print "$columns[0]\n";
};

Cela modifiera le fichier en place puisque vous dites que c'est un gros fichier. Vous pouvez également créer une sauvegarde en modifiant local $^I = ''; en local $^I = '.bak';.

1
DavidG
awk '{ print $1 }' file_name.txt > tmp_file_name.txt
mv tmp_file_name.txt file_name.txt

'> tmp_file_name.txt' signifie rediriger STDOUT de awk '{ print $1 }' file_name.txt vers un fichier nommé tmp_file_name.txt

FYI:

$1 means first column based on delimiter. The default delimiter is whitespace
$2 means second column based on delimiter. The default delimiter is whitespace
..
..
$NR means last column based on delimiter. The default delimiter is whitespace

Si vous souhaitez modifier le délimiteur, utilisez awk avec -F

0
Suku