基于另一个 file_2 从 file_1 获取行
Fetching rows from file_1 based on another file_2
我有一个制表符分隔的文本文件,如下所示:
file_1:
A1 13f Jos +
B1 zh4 Kia -
C2 nh2 Met -
D3 5gh Lox +
F4 w4t Nit -
file_2
N3 6jg Jut -
J8 76d Met +
A1 99g Kia -
M6 45k Qox +
V2 87h Nit -
我想从 file_1 中提取条目,其中第 3 列条目与 file_2 的第 3 列条目匹配,如下 linux:
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
comm-12 file_1.txt file_2.txt
会有帮助吗?请指导我
comm
期望文件按要比较的列排序,并且其参数之前的 space 不是可选的。
但是您可以使用 cut
提取文件 1 的第三列,如果它们不能出现在任何其他列中,则可以使用 grep
从文件 2 中提取该值:
cut -f3 file_1 | grep -Ff- file_2
虽然行的顺序对应于文件 2。
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
为了获得正确的顺序,我会使用 Perl:
perl -e 'until (eof) {
@F = split " ", <>;
$h{ $F[2] } = 1;
}
while (<>) {
@F = split " ";
print if $h{ $F[2] };
}' file_1 file_2
它首先将file_1的第三列($F[2]
)值存储到散列%h
中,然后遍历file_2并检查列的值是否在散列中设置了 3。
awk
在这里可能是最简单的(这保留了 file_1
输入顺序):
$ awk 'NR==FNR { seen[]++; next } seen[]' file_2 file_1
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
Pattern NR==FNR
仅匹配来自第一个输入文件 (file_2
) 的行,并使用 action { seen[]++; next }
构建所有第 3 列值的关联数组
seen[]++
是构造包含一组唯一字段值的关联的常用习惯用法:隐式访问数组 seen
中的键 </code>(第 3 个字段的值)<em>在第一次访问时为那个键创建</em>一个条目,post-increment <code>++
给条目一个非零值,它在布尔上下文中计算为真(下面讨论的模式利用了)。
由于前面的操作中的 next
,模式 seen[]
仅针对第二个输入文件 (file_1
) 执行,并且仅计算为真如果第二个文件的第 3 列值也存在于第一个文件中。计算结果为 true 的模式隐式打印手边的行。
awk 回答。这适用于小文件。对于大文件,看到的数组会变得很大,因为数组中保留了完整的行[=12=]
。
awk 'NR==FNR { seen[] = [=10=]; next} in seen {print seen[]}' file_2 file_1
输出
A1 99g Kia -
J8 76d Met +
V2 87h Nit -
我有一个制表符分隔的文本文件,如下所示:
file_1:
A1 13f Jos +
B1 zh4 Kia -
C2 nh2 Met -
D3 5gh Lox +
F4 w4t Nit -
file_2
N3 6jg Jut -
J8 76d Met +
A1 99g Kia -
M6 45k Qox +
V2 87h Nit -
我想从 file_1 中提取条目,其中第 3 列条目与 file_2 的第 3 列条目匹配,如下 linux:
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
comm-12 file_1.txt file_2.txt
会有帮助吗?请指导我
comm
期望文件按要比较的列排序,并且其参数之前的 space 不是可选的。
但是您可以使用 cut
提取文件 1 的第三列,如果它们不能出现在任何其他列中,则可以使用 grep
从文件 2 中提取该值:
cut -f3 file_1 | grep -Ff- file_2
虽然行的顺序对应于文件 2。
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
为了获得正确的顺序,我会使用 Perl:
perl -e 'until (eof) {
@F = split " ", <>;
$h{ $F[2] } = 1;
}
while (<>) {
@F = split " ";
print if $h{ $F[2] };
}' file_1 file_2
它首先将file_1的第三列($F[2]
)值存储到散列%h
中,然后遍历file_2并检查列的值是否在散列中设置了 3。
awk
在这里可能是最简单的(这保留了 file_1
输入顺序):
$ awk 'NR==FNR { seen[]++; next } seen[]' file_2 file_1
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
Pattern
NR==FNR
仅匹配来自第一个输入文件 (file_2
) 的行,并使用 action{ seen[]++; next }
构建所有第 3 列值的关联数组seen[]++
是构造包含一组唯一字段值的关联的常用习惯用法:隐式访问数组seen
中的键</code>(第 3 个字段的值)<em>在第一次访问时为那个键创建</em>一个条目,post-increment <code>++
给条目一个非零值,它在布尔上下文中计算为真(下面讨论的模式利用了)。
由于前面的操作中的
next
,模式seen[]
仅针对第二个输入文件 (file_1
) 执行,并且仅计算为真如果第二个文件的第 3 列值也存在于第一个文件中。计算结果为 true 的模式隐式打印手边的行。
awk 回答。这适用于小文件。对于大文件,看到的数组会变得很大,因为数组中保留了完整的行[=12=]
。
awk 'NR==FNR { seen[] = [=10=]; next} in seen {print seen[]}' file_2 file_1
输出
A1 99g Kia -
J8 76d Met +
V2 87h Nit -