在 AWK 中,对于在两个文件上运行的脚本,这种结构很常见:
awk 'NR==FNR { print "first file"; next } { print "second file" }' file1 file2
它使用了定义了两个变量的事实:FNR
,它是当前文件中的行号和 NR
,它是全局计数(相当于 Perl 的$.
).
Perl 中有类似的东西吗?我想我也许可以使用 eof
和一个计数器变量:
perl -nE 'if (! $fn) { say "first file" } else { say "second file" } ++$fn if eof' file1 file2
这行得通,但感觉我可能遗漏了什么。
为了提供一些上下文,我写了 this answer我在其中手动定义了一个散列,但相反,我想从第一个文件中的值填充散列,然后对第二个文件进行替换。我怀疑在 Perl 中有一种简洁、惯用的方法可以做到这一点。
最佳答案
不幸的是,perl
没有类似的NR==FNR
结构来区分两个文件。您可以做的是使用 BEGIN
block 处理一个文件,使用主体处理另一个文件。
例如,要处理具有以下内容的文件:
map .txt
a=apple
b=ball
c=cat
d=dog
alpha.txt
f
a
b
d
你可以这样做:
perl -lne'
BEGIN {
$x = pop;
%h = map { chomp; ($k,$v) = split /=/; $k => $v } <>;
@ARGV = $x
}
print join ":", $_, $h{$_} //= "Not Found"
' map.txt alpha.txt
f:Not Found
a:apple
b:ball
d:dog
更新:
我给出了一个非常简单的例子,现在当我看到它时,我只能说 TIMTOWDI
因为你可以这样做:
perl -F'=' -lane'
if (@F == 2) { $h{$F[0]} = $F[1]; next }
print join ":", $_, $h{$_} //= "Not Found"
' map.txt alpha.txt
f:Not Found
a:apple
b:ball
d:dog
但是,我可以肯定地说,perl
没有NR==FNR
结构,您可以根据文件以各种不同的方式处理它们。
关于perl - 检测单行中的第一个或第二个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349157/