Mam plik zawierający następujące treści 1000 wiersz w następującym formacie:Jak mogę wydrukować tylko określone pola w pliku oddzielonym spacją?
abc def ghi gkl
Jak mogę napisać skrypt Perl, aby drukować tylko pierwsza i trzecia pól?
abc ghi
Mam plik zawierający następujące treści 1000 wiersz w następującym formacie:Jak mogę wydrukować tylko określone pola w pliku oddzielonym spacją?
abc def ghi gkl
Jak mogę napisać skrypt Perl, aby drukować tylko pierwsza i trzecia pól?
abc ghi
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! ;-)
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
Jeśli używasz ścisłe i ostrzeżenie, może chcesz zamknij plik na końcu skryptu :-) – Aif
perl -lane 'print "@F[0,2]"' < file
Używanie Perla w trybie awk-zabójcy - z autosplitem. –
-a niejawnie ustawia -n, więc nie potrzebujesz n. Wystarczy więc perl -lae. Ale w każdym razie najlepszą odpowiedzią jest tutaj –
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]"'
while(<>){
chomp;
@s = split ;
print "$s[0] $s[2]\n";
}
należy rozpocząć przejść przez documentation i
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 (",, _ _) ". –
To naprawdę marnuje coś tak potężnego jak Perl, ponieważ możesz zrobić to samo w jednej banalnej linii awk.
awk '{ print $1 $3 }'
To strata czasu, aby nauczyć się "awk", gdy znasz Perla. – codeholic
@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
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. –
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 ">>".
+1 do cięcia. Chociaż cut ma opcjonalny argument pliku, więc prawdopodobnie omijam kota i fajkę. – Hobo
@Hobo: prawda, poprawię to. Dzięki za wskazówkę. –
#!/usr/bin/env perl
open my$F, "<", "file" or die;
print join(" ",(split)[0,2])."\n" while(<$F>);
close $F
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")'
Byłem zmieszany co do konstrukcji [], musiałem iść na #perl i pytać. To "plaster": https://perldoc.perl.org/perldata.html#Slices. – Richlv
może nawet interesująco zastąpić 'split ''' by 'split/\ s + /' podzielić na wszystkie rodzaje spacji (powtórzone lub nie) – Aif
@Aif Dzielenie przez ''' 'ma specjalne znaczenie w Perlu. – codeholic
co to znaczy? – Aif