gpt4 book ai didi

perl - 检测单行中的第一个或第二个文件

转载 作者:行者123 更新时间:2023-12-04 02:23:29 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com