2013-04-23 91 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