2013-04-23 86 views
0

如何將文件傳遞給perl腳本進行處理,並且還使用heredoc語法來處理多行perl腳本?我已經試過這些,但沒有運氣:多行perl使用標準輸入法的多行perl的heredoc語法

cat ng.input | perl -nae <<EOF 
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" } 
EOF 

cat ng.input | perl -nae - <<EOF 
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" } 
EOF 
+0

所有你需要的是'perl的-ple'$ _ = 「\ t $ _」 如果!/@ t /''(如果@F <2時@F!= 2,並且輸入是特定的tab分隔符而不是空格分隔的) – ikegami 2013-04-23 01:55:33

回答

1

使用過程換人:

cat ng.input | perl -na <(cat <<'EOF' 
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" } 
EOF 
) 

也把周圍的EOF標籤單引號,這樣$F在Perl腳本就不會被shell變量擴展。

+0

@JonathanLeffler謝謝,我甚至沒有注意到'-e'原來的問題。 – Barmar 2013-04-23 01:32:37

3

這裏真的不需要這裏的文檔。你可以簡單地使用多行參數:

perl -nae' 
    if (@F==2) { 
     print $F[0] . "\t". $F[1] . "\n" 
    } else { 
     print "\t" . $F[0] . "\n" 
    } 
' ng.input 

乾淨,比Barmar的更便攜,並且只使用一個過程,而不是Barmar三個。


請注意,您的代碼可以縮小到

perl -lane'unshift @F, "" if @F!=2; print "$F[0]\t$F[1]";' ng.input 

甚至

perl -pale'unshift @F, "" if @F!=2; $_="$F[0]\t$F[1]";' ng.input 
+0

我假設問題中的'cat ng.input'只是一個其他進程的佔位符,它將管道輸入到腳本中。否則使用here-doc不會有問題。 – Barmar 2013-04-23 01:33:26

+0

@Barmar,這完全是重點。多行參數也可以與'... |一起使用perl'。 (但是爲了解決你的評論,你低估了有多少人使用'cat file |'。) – ikegami 2013-04-23 01:39:38

+0

這就是爲什麼有一個UUOC獎,但實際上,很難找到一個新的UUOC - 他們主要是世俗的重複同樣的老問題,一遍又一遍。 – 2013-04-23 01:48:16