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
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
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 pourcut
command
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.
Essaye ça
awk '{$1=$1; print $1}' temp.txt
Sortie
10.2.57.44
120.149.20.197
10.90.158.161
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
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';
.
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