2013-01-15 13 views
12

ich eine Textdatei, in der ich so etwas wie this-Unix-Befehl, alles zu entfernen, nachdem erste Spalte

10.2.57.44  56538154 3028 
120.149.20.197 28909678 3166 
10.90.158.161 869126135 6025 

In dieser Textdatei, ich habe um 1.000.000 Zeilen genau wie oben. Ich arbeite in SunOS-Umgebung. Ich brauchte einen Weg, um alles aus dieser Textdatei zu entfernen, wobei nur die IP-Adresse übrig blieb (die erste Spalte in der obigen Textdatei ist die IP-Adresse). Nach dem Ausführen eines Unix-Befehls sollte die Datei wie folgt aussehen.

10.2.57.44 
120.149.20.197 
10.90.158.161 

Kann jemand bitte helfen Sie mir mit einigen Unix-Befehl aus, der wieder die ganze Sache so dass nur IP-Adresse (erste Säule) und speichern Sie es zurück zu einem gewissen Datei entfernen können.

So Ausgang so etwas wie dies in einigen File-

10.2.57.44 
120.149.20.197 
10.90.158.161 
+0

awk Modifikation kann leicht diese Aufgabe tun, wenn es auf SunOS zur Verfügung steht. – louxiu

Antwort

7
nawk '{print $1}' file > newFile && mv newFile file 

ODER

cut -f1 file > newFile && mv newFile file 

Wie Sie SunOS verwenden, werden Sie mit nawk (nicht awk vertraut machen wollen, das ist die alte und launische Version von awk, während nawk = new awk ;-).

In beiden Fällen drucken Sie das erste Feld in der Datei in newFile.

(n) awk ist eine komplette Programmiersprache für die einfache Manipulation von Textdateien. Die $1 bedeutet das erste Feld in jeder Zeile, $ 9 würde das neunte Feld usw. bedeuten, während $ 0 die gesamte Zeile bedeutet. Sie können (n) awk angeben, was Sie zum Trennen der Felder verwenden möchten, es könnte ein Tab-Zeichen oder ein '|' oder mehrere Leerzeichen. Standardmäßig verwenden alle Versionen von awk Leerzeichen, d. H. Mehrere Leerzeichen, oder 1 Tab, um die Spalten/Felder pro Zeile in einer Datei zu begrenzen.

Für eine sehr gute Einführung in awk, siehe Grymoire's Awk page

Die && Mittel, wenn nur der nächste Befehl ausgeführt wird, wenn der vorherige Befehl ohne Probleme beendet. Auf diese Weise löschen Sie nicht versehentlich Ihre gute Datei, weil ein Fehler aufgetreten ist.

IHTH

+0

Das sollte also gut funktionieren, oder? 'awk '{print $ 1}' DEipsjan.txt> DE-IP-List.txt' – ferhan

+0

@TechGeeky Das * wird * gut funktionieren. – squiguy

+0

Angesichts Ihrer Verwendung von SunOS, beachten Sie meine Präferenz für die Verwendung von "neuen" awk, d.h. nawk. (awk funktioniert für den ersten Fall, gibt aber keine guten Fehlermeldungen). – shellter

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

'> tmp_file_name.txt' bedeutet Umleitung STDOUT von awk '{ print $1 }' file_name.txt in eine Datei namens tmp_file_name.txt sein sollte

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 

Wenn Sie Trennzeichen ändern möchten, verwenden Sie awk mit -F

14

Wenn Begrenzer Zeichenraum

cut -d " " -f 1 filename 

verwenden Wenn Trennzeichen Tab-Zeichen ist, nicht nötig Option -d als Tab für Standardtrennzeichen ist cut Befehl

cut -f 1 filename 

-d Trennzeichen; Das Zeichen unmittelbar nach der Option -d ist das Feldtrennzeichen.

-f Gibt eine Feldliste, durch ein Trennzeichen getrennt

+2

Dies ist bei weitem die beste Lösung. Es ist eine Schande, dass es nicht die akzeptierte Antwort ist, und dass es so viele absurd komplexe alternative Lösungen gibt. – mgadda

1

Wenn Sie vim haben, damit die Datei öffnen. Dann im Befehlsmodus schreiben für Substitution (Tab oder Leerzeichen oder was auch immer ist das Trennzeichen) %s:<delimiter>.*$::g. Speichern Sie jetzt die Datei mit :wq.

Mit sed geben Befehl wie diese sed -e 's/<delimiter>.*$//' > file.txt

1

Wie über eine Perl-Skript;)

#!/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"; 
}; 

Dadurch wird die Datei an Ort und Stelle bearbeiten, da Sie sagen, dass es ein großes ist. Sie können auch ein Backup erstellen, indem local $^I = ''; zu local $^I = '.bak';

1

Versuchen Sie, diese

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

Ausgabe

10.2.57.44 
120.149.20.197 
10.90.158.161 
+0

Dies kann zu 'awk' {print $ 1} 'temp.txt' verkürzt werden – pjvds