读取行
我有一个标签delimted文本文件,如下所示:读取行
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
有帮助吗?请引导我
awk
可能是最简单的在这里(在此保留file_1
输入顺序):
$ awk 'NR==FNR { seen[$3]++; next } seen[$3]' file_2 file_1
B1 zh4 Kia -
C2 nh2 Met -
F4 w4t Nit -
-
模式
NR==FNR
只匹配从第一输入文件(file_2
)线,并构建所有3rd-的关联数组列值与动作{ seen[$3]++; next }
-
seen[$3]++
是一个常见的习惯用法包含一组唯一字段值的关联:隐式地访问阵列seen
中的密钥$3
(第3个字段的值)创建第一次访问时该密钥的条目,并且后递增++
给出条目非零值,其在布尔上下文中评估为真(下面讨论的模式利用)。
-
由于在之前的动作的
next
,图案seen[$3]
然后仅用于第二输入文件(file_1
)执行,并且仅评估为真,如果第二文件的第三列的值也存在于所述第一文件。评估为真的模式隐式地打印手中的线。
+1对于优秀的答案我有一个关于订单的问题,这会打印'Kia' 'Met'...有一种方法可以让订单遵循file2的顺序。问题在'Kia'之前显示'Met' –
谢谢,@JayRajput。我假设OP的真正意图是保留'file_1'输入顺序,尽管最初的样本输出不一致(OP已经修正) – mklement0
yup。看到了......现在等待OP接受您的答案 –
comm
期望文件按列进行排序以进行比较,并且其参数之前的空格不是可选的。
但是可以提取与cut
从文件2 grep
值文件1的第三列中,并且提取物如果他们不能在任何其他列出现:
cut -f3 file_1 | grep -Ff- file_2
线对应的顺序到file2,但。
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
它首先将第三列($F[2]
)的file_1值到哈希%h
,然后越过file_2和检查是否在散列中设置了列3的值。
awk答案。对于小文件这是可以的。对于大文件,整个行$0
保存在数组中,所看到的数组将变得很大。
awk 'NR==FNR { seen[$3] = $0; next} $3 in seen {print seen[$3]}' file_2 file_1
输出
A1 99g Kia -
J8 76d Met +
V2 87h Nit -
这是一个有趣的变化,但请注意,它只会在在'file_2'的第三列中没有重复;否则,您将失去输出行。 – mklement0
我不明白。第一个输出线来自文件2,但第2和3行来自文件1. – choroba
@choroba我编辑了这个问题。抱歉给你带来不便。 – Chudar
不应该在'Met'之前出现'kia'这一行,对输出行的排序是否有任何要求? –