2010-11-24 4 views
1

때까지 특정 라인에서 읽기 시작하고 만 라인의 첫 번째 열을 얻을 :펄 나는 다음과 같은 텍스트 파일이 마지막

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 
filename2.tif;Smpl/Pix & Bits/Smpl are missing. 

항상 동일 5 줄이 있습니다, 6 번째 줄에는 데이터 읽기를 시작하겠습니다. 데이터를 읽을 때 각 행 (6 행부터 시작)은 세미콜론으로 구분됩니다. 각 행의 첫 번째 항목을 가져와야합니다 (6 행부터 시작). 예를 들어

: 것 원하는

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 
filename2.tif;Smpl/Pix & Bits/Smpl are missing. 
filename4.tif;Smpl/Pix & Bits/Smpl are missing. 
filename6.tif;Smpl/Pix & Bits/Smpl are missing. 
filename8.tif;Smpl/Pix & Bits/Smpl are missing. 

출력 :

filename2.tif 
filename4.tif 
filename6.tif 
filename8.tif 

이 그래서 가능하면되고, 내가 시작합니까를?

+1

이 가능합니다. 아직 코드가 있습니까? – aschepler

+0

예, 아니요. 아직까지는 아닙니다. 그러나 이것을 구현하려고하는 300 라인 이상의 코드가 있습니다. 기본적으로 이미 존재하는 텍스트 파일에서 파일을 처리하기 위해 구현하려는 새로운 기능입니다. – drewrockshard

+0

모든 질문에 대한 답변 * "Perl에서 할 수있는 일은 ...?"* ** "예!"** 그러나 일부 답변은 ** "예,하지만 ...."로 계속됩니다. ** – tchrist

답변

4

이 펄 '자동 구분을'사용 (또는 'AWK') 모드 :

perl -n -F'/;/' -a -e 'next if $. <= 5; print "$F[0]\n";' < data.file 

페이지의 'perlrun'와 'perlvar'.


당신이 파일 핸들 및 건너 뛸 라인의 번호가 부여되는 함수에서이 작업을 수행해야하는 경우, 다음 펄 '자동 구분'모드를 사용하지 않습니다.

sub skip_N_lines_read_column_1 
{ 
    my($fh, $N) = @_; 
    my $i = 0; 
    my @files =(); 
    while (my $line = <$fh>) 
    { 
     next if $i++ < $N; 
     my($file) = split /;/, $line; 
     push @files, $file; 
    } 
    return @files; 
} 

은 루프 초기화 행을 분할 및 첫 번째 결과를 캡처, 그 제 N 스킵 라인을 판독한다. my($file) = split...의 줄은 미묘합니다. 괄호는 스플릿에 목록 컨텍스트가 있음을 의미하므로 값의 수가 아닌 값의 목록을 생성하고 첫 번째를 변수에 할당합니다. 괄호가 생략 된 경우 목록 연산자에 스칼라 컨텍스트를 제공하므로 분할 출력의 필드 수를 $file에 할당 할 수 있습니다. 필요한 것은 아닙니다. 파일 이름이 배열 끝에 추가되고 배열이 반환됩니다. 코드가 파일 핸들을 열지 않았으므로 코드를 닫지 않습니다. 대체 인터페이스는 파일 이름 (열린 파일 핸들 대신)을 함수에 전달합니다. 그런 다음 오류 처리에 대해 걱정하면서 함수에서 파일을 열고 닫습니다.

그리고 당신은 다음, 등, 파일을 여는 함께 도움이 필요한 경우 :

use Carp; 

sub open_skip_read 
{ 
    my($name) = @_; 
    open my $fh, '<', $name or croak "Failed to open file $name ($!)"; 
    my @list = skip_N_lines_read_column_1($fh, 5); 
    close $fh or croak "Failed to close file $name ($!)"; 
    return @list; 
} 
+0

+1. 가장 좋은 답변입니다. 난 내 뇌의 펄 부분을 구해야 해 :) –

+0

스크립트에 명령 줄이 아니라 어떻게 쓰고 이미 존재하는 파일의 열린 파일 핸들을 읽어들 일까? – drewrockshard

+0

@Jonathan : 그것은 perl이 구분 기호 주위에 슬래시 구분 기호를 중얼 거려한다는 것을 알고 놀라게합니다. 나는 그것이 그것을했다라는 것을 모르고 있었다! – tchrist

2

다소 못 생겼지 만 더미 라인을 읽고 나눈 다음, 나머지 사람들은.

my $logfile = '/path/to/logfile.txt'; 

open(FILE, $logfile) || die "Couldn't open $logfile: $!\n"; 

for (my $i = 0 ; $i < 5 ; $i++) { 
    my $dummy = <FILE>; 
} 

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

close(FILE); 
+0

다음과 같이 작성할 수 있습니다 :'my @dummy; @dummy [0..4] = ; map {($ a) = split /; /; print $ a, "\ n"} ; –

+0

파일에서 읽으려고하지만 명령 줄에서 읽으려고하면 어떻게됩니까? 상대 위치에있는 파일이 있습니다 (예 : logfile.txt로 호출 할 수 있습니다). 지금까지 코드를 읽는 데 문제가 있습니다. 지금까지 코드가 while 루프를 계속해서 쏘고 있으며, Ctrl + C를 눌러야합니다. – drewrockshard

+1

@Diego : * Por desgracia, * 슬라이스 할당에서'readline' 연산자에 목록 컨텍스트를 제공했기 때문에 * 작동하지 않습니다. 따라서 입력을 소모합니다. 나머지 줄들은 버려졌습니다. – tchrist

2
#!/usr/bin/env perl 
# 
# name_of_program - what the program does as brief one-liner 
# 
# Your Name <[email protected]_host.TLA> 
# Date program written/released 
################################################################# 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings FATAL => "all"; 

# ⚠ change to agree with your input: ↓ 
use open ":std" => IN => ":encoding(ISO-8859-1)", 
        OUT => ":utf8"; 
# ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better 

END {close STDOUT} 

our $VERSION = 1.0; 

$| = 1; 

if (@ARGV == 0 && -t STDIN) { 
    warn "reading stdin from keyboard for want of file args or pipe"; 
} 

while (<>) { 
    next if 1 .. 5; 
    my $initial_field = /^([^;]+)/ ? $1 : next; 
    # ╔═══════════════════════════╗ 
    # ☞ your processing goes here ☜ 
    # ╚═══════════════════════════╝ 
} continue { 
    close ARGV if eof; 
} 

__END__ 
+0

얘들 아, 아직도 잃어 버렸어. ** Perl **에 새로 온다. **. 이미 모든 것을 포함하고있는 파일이 있습니다. 스크립트에서 파일을 열고 처음 5 줄을 건너 뛰고 5 줄 뒤에 모든 줄의 첫 번째 줄을 출력하면됩니다. – drewrockshard

+0

@drewsrockhard : 그건 내 프로그램이하는 일입니다. 그것을 밖으로 시도하십시오. – tchrist

+0

이것을 실행하는 방법과 "입력 파일"을 둘 위치에 대한 예제를 보여줄 수 있습니까? – drewrockshard

관련 문제