2010-03-19 11 views

Odpowiedz

15

Jeśli żadna odpowiedź nie jest dobre dla ciebie jeszcze, postaram się dostać nagrodę ;-)

#!/usr/bin/perl 
# Lines beginning with a hash (#) denote optional comments, 
# except the first line, which is required, 
# see http://en.wikipedia.org/wiki/Shebang_(Unix) 

use strict; # http://perldoc.perl.org/strict.html 
use warnings; # http://perldoc.perl.org/warnings.html 

# http://perldoc.perl.org/perlsyn.html#Compound-Statements 
# http://perldoc.perl.org/functions/defined.html 
# http://perldoc.perl.org/functions/my.html 
# http://perldoc.perl.org/perldata.html 
# http://perldoc.perl.org/perlop.html#I%2fO-Operators 
while (defined(my $line = <>)) { 
    # http://perldoc.perl.org/functions/split.html 
    my @chunks = split ' ', $line; 
    # http://perldoc.perl.org/functions/print.html 
    # http://perldoc.perl.org/perlop.html#Quote-Like-Operators 
    print "$chunks[0] $chunks[2]\n"; 
} 

Aby uruchomić ten skrypt, biorąc pod uwagę, że jego nazwa jest script.pl, wywołać ją jak

perl script.pl FILE 

gdzie FILE jest plikiem, który chcesz analizować. Zobacz także http://perldoc.perl.org/perlrun.html. Powodzenia! ;-)

+0

może nawet interesująco zastąpić 'split ''' by 'split/\ s + /' podzielić na wszystkie rodzaje spacji (powtórzone lub nie) – Aif

+0

@Aif Dzielenie przez ''' 'ma specjalne znaczenie w Perlu. – codeholic

+0

co to znaczy? – Aif

4

jak Perl jedną wkładką:

perl -ane 'print "@F[0,2]\n"' file

lub jako wykonywalnego skryptu:

#!/usr/bin/perl 

use strict; 
use warnings; 

open my $fh, '<', 'file' or die "Can't open file: $!\n"; 

while (<$fh>) { 
    my @fields = split; 
    print "@fields[0,2]\n"; 
} 

Wykonaj skrypt tak:

perl script.pl 

lub

chmod 755 script.pl 
./script.pl 
+1

Jeśli używasz ścisłe i ostrzeżenie, może chcesz zamknij plik na końcu skryptu :-) – Aif

11
 
    perl -lane 'print "@F[0,2]"' < file 
+0

Używanie Perla w trybie awk-zabójcy - z autosplitem. –

+0

-a niejawnie ustawia -n, więc nie potrzebujesz n. Wystarczy więc perl -lae. Ale w każdym razie najlepszą odpowiedzią jest tutaj –

8
while (<>) { 
    my @fields = split; 
    print "@fields[0,2]\n"; 
} 

i po prostu dla odmiany, w systemie Windows:

C:\Temp> perl -pale "$_=qq{@F[0,2]}" 

i Unix

$ perl -pale '$_="@F[0,2]"' 
1
while(<>){ 
    chomp; 
    @s = split ; 
    print "$s[0] $s[2]\n"; 
} 

należy rozpocząć przejść przez documentation i

+1

http://perldoc.perl.org/functions/split.html: Podział na '/ \ s + /' jest jak 'split ('')', z wyjątkiem tego, że każda prowadząca biała spacja daje zero pierwsze pole. Podział bez argumentów naprawdę robi wewnętrznie "split (",, _ _) ". –

13

To naprawdę marnuje coś tak potężnego jak Perl, ponieważ możesz zrobić to samo w jednej banalnej linii awk.

awk '{ print $1 $3 }'

+5

To strata czasu, aby nauczyć się "awk", gdy znasz Perla. – codeholic

+6

@codeholic, jeśli OP * wiedział * Perl, nie zadają pytania. Używanie Perla do tego jest jak użycie termojądrowej głowicy, aby spróbować zabić muchę. +1 dla tej odpowiedzi. – paxdiablo

+0

Nie mówi platformy, ale łatwiej uzyskać perl niż awk dla Windows. Ponadto może to być częścią większego zadania programistycznego ... Jestem pewien, że awk jest do tego gotowy, ale czasami praca chce tego, czego chce. –

4

Jestem pewien, że nie powinien dostać nagrodę, ponieważ kwestia prosi o wynik należy podać w Perl, ale w każdym razie:

W bash/ksh/popiołu/etc:

cut -d " " -f 1,3 "file" 

W Windows/DOS:

for /f "tokens=1-4 delims= " %i in (file) do (echo %i %k) 

Zalety: jak mówili inni, nie ma potrzeby, aby dowiedzieć Pearl, aWK, nic, tylko znając pewne narzędzia. Wynik obu połączeń można zapisać na dysku za pomocą operatora ">" i ">>".

+0

+1 do cięcia. Chociaż cut ma opcjonalny argument pliku, więc prawdopodobnie omijam kota i fajkę. – Hobo

+0

@Hobo: prawda, poprawię to. Dzięki za wskazówkę. –

0
#!/usr/bin/env perl 
open my$F, "<", "file" or die; 
print join(" ",(split)[0,2])."\n" while(<$F>); 
close $F 
0

Prostym sposobem jest:

(split)[0,2] 

Przykład:

$_ = 'abc def ghi gkl'; 
print((split)[0,2] , "\n"); 
print(join(" ", (split)[0,2] ),"\n"); 

Linia komend:

perl -e '$_="abc def ghi gkl";print(join(" ",(split)[0,2]),"\n")' 
+0

Byłem zmieszany co do konstrukcji [], musiałem iść na #perl i pytać. To "plaster": https://perldoc.perl.org/perldata.html#Slices. – Richlv