我正在使用 bash 外壳。如果我有行号文件
1
4
7
9
和另一个行文件,其中第一个元素是一个数字,后跟一串文本
1,Michael Jordan
2,Karl Malone,
3,Charles Barkley
4,Greg Anthony
5,Chris Mullen
6,Reggie Miller
7,Billy Owens
8,David Robinson
9,Shaquille O'Neal
10,John Stockton
awk
仅当第一个数字属于第一个文件时,如何编写命令从第二个文件中提取行?在上面的例子中,我希望这个结果
1,Michael Jordan
4,Greg Anthony
7,Billy Owens
9,Shaquille O'Neal
我试过这个
awk 'FNR==NR{a[$1];next} $1 in a' /tmp/first_file /tmp/second_file > /tmp/third_file
但它在第三个文件中什么也没有产生。
由于您的第二个文件是逗号分隔的,因此您需要将 awk 字段分隔符设置为
,
- 全局使用-F
命令行选项:或者通过
FS
内置变量:后一种方法允许您处理第一个文件不是逗号分隔(并且有多个字段)的情况。
使用Raku(以前称为 Perl_6)
Raku 是 Perl 家族中的一种编程语言。正如您一样
BEGIN
,获取数字列表并将其存储在数组中,@a
。然后标志-ne
从命令行读取文件而不自动打印(awk
类似行为)。此处,该行被读入逗号上的主题变量 (
$_
),并采用split
第一个元素 ( )。[0]
这些元素使用==
数值相等运算符(第一个代码示例)或 Raku 的~~
智能匹配运算符进行比较。在运算符的 RHS 上,@a
数组变成了一个any()
结点。如果满足条件,则条件输出if
行。put
示例输入:
示例输出(使用
nbr_list.txt
由 1、4、7、9 组成的文件):连接点很有趣,因为它们会自动穿线。对于上述问题,
one()
联结也有效,甚至可能更有效率。另一种方法是使用 Sets:行号被转换为 a
Set
ofInt
s。数据按行读取,每个第一列都被强制转换为Int
,并检查它是否是(elem)
集合中的一个元素。请注意,可以在以下代码中使用infix(elem)
或 infix , (Unicode 符号):∈
https://docs.raku.org/type/Junction
https://docs-stage.raku.org/type/Junction
https://raku.org