2013-01-15 16 views
12

Ho un file di testo in cui ho qualcosa di simile questo-Unix comando per rimuovere tutto dopo prima colonna

10.2.57.44  56538154 3028 
120.149.20.197 28909678 3166 
10.90.158.161 869126135 6025 

In questo file di testo, ho circa 1.000.000 righe esattamente come sopra. Sto lavorando in ambiente SunOS. Avevo bisogno di un modo per rimuovere tutto da quel file di testo lasciando solo l'indirizzo IP (la prima colonna nel file di testo sopra riportato è l'indirizzo IP). Quindi dopo aver eseguito un comando unix, il file dovrebbe apparire come qualcosa di seguito.

10.2.57.44 
120.149.20.197 
10.90.158.161 

Qualcuno può aiutarmi con qualche comando Unix che può rimuovere tutta la cosa lasciando solo indirizzo IP (prima colonna) e salvarlo di nuovo a qualche file di nuovo.

Così uscita dovrebbe essere qualcosa di simile in qualche file-

10.2.57.44 
120.149.20.197 
10.90.158.161 
+0

awk può fare questa operazione con facilità se è disponibile sul SunOS. – louxiu

risposta

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

O

cut -f1 file > newFile && mv newFile file 

che si sta utilizzando SunOS, ti consigliamo di acquisire familiarità con nawk (non awk, che è la vecchia e irritante versione di awk, mentre nawk = new awk ;-).

In entrambi i casi, si sta stampando il primo campo nel file su newFile.

(n) awk è un linguaggio di programmazione completo progettato per la facile manipolazione di file di testo. Il $1 significa il primo campo su ogni riga, $ 9 significherebbe il nono campo, ecc., Mentre $ 0 indica l'intera linea. Puoi dire (n) awk cosa usare per separare i campi, potrebbe essere un tab char, o un '|' char, o più spazi. Per impostazione predefinita, tutte le versioni di awk utilizzano lo spazio bianco, ovvero spazi multipli o 1 scheda per delimitare le colonne/i campi, per riga in un file.

Per una buona introduzione ad awk, vedere Grymoire's Awk page

I mezzi &&, eseguire il comando successivo solo se il comando precedente terminato senza problemi. In questo modo non cancelli accidentalmente il tuo file di dati di buona qualità, a causa di qualche errore.

IHTH

+0

Quindi questo dovrebbe funzionare bene? 'awk '{print $ 1}' DEipsjan.txt> DE-IP-List.txt' – ferhan

+0

@TechGeeky Che * funzionerà bene. – squiguy

+0

dato l'utilizzo di SunOS, nota la mia preferenza per l'utilizzo di "nuovo" awk, ad esempio nawk. (awk funzionerà per il tuo primo caso, ma non fornisce buoni messaggi di errore). – shellter

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

'> tmp_file_name.txt' significa riorientando STDOUT di awk '{ print $1 }' file_name.txt in un file denominato 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 

Se si desidera cambiare delimitatore, utilizzare awk con -F

14

Se delimitatore è utilizzare carattere di spazio

cut -d " " -f 1 filename 

Se delimitatore è il carattere scheda, senza bisogno di opzione -d come scheda è delimitatori di default per cut comando

cut -f 1 filename 

-d Delimitatore; il carattere che segue immediatamente l'opzione -d è il delimitatore di campo.

-f Specifica un elenco di campi, separati da un delimitatore

+2

Questa è di gran lunga la soluzione migliore. È un peccato che non sia la risposta accettata e che ci siano così tante soluzioni alternative assurdamente complesse. – mgadda

1

Se avete vim, aprire il file con esso. Quindi in modalità di comando scrivi per sostituzione (scheda o spazio o qualsiasi cosa sia il delimitatore) %s:<delimiter>.*$::g. Ora salva il file con :wq.

Utilizzando sed comando dare come questo sed -e 's/<delimiter>.*$//' > file.txt

1

ne dite di uno 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"; 
}; 

Ciò permetterà di modificare il file in vigore dal si dice che è un grande. È inoltre possibile creare una copia di backup modificando local $^I = ''; a local $^I = '.bak';

1

Prova questo

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

uscita

10.2.57.44 
120.149.20.197 
10.90.158.161 
+0

Questo può essere abbreviato in 'awk '{print $ 1}' temp.txt' – pjvds

Problemi correlati