我需要从 file2 中提取所有以 file1 中包含的 id # 前缀开头的行。
文件 1 是单列,例如:
324
399
408
135236
321590
文件 2 是多列的,例如:
1 [tab] 108 [tab] Anarchist [tab] 103985
...
324 [tab] 309 [tab] Melodies [tab] 230498
从 File2 中提取这些行的最快最简单的方法是什么?
答案1
$ while read p; do awk '$1 == "'$p'"' file2; done < file1
或者:
$ awk -F'\t' 'FNR==NR { a[$0]; next } $1 in a' file1 file2
FNR
:正在处理的当前文件中读取的记录数NR
:输入记录总数FNR==NR
awk
: 仅在读取时才为真file1
a[$0]
$0
:创建一个由(从file1
)索引的数组元素$1 in a
:检查读取的每一行是否file2
作为数组中的索引存在a
答案2
bash 代码来执行此操作:
for i in $(cat file1); do egrep "^$i\s" file2; done
答案3
这可能是最快的:
grep -f <( sed 's/.*/^&\t/' file1) file2
for
使用和循环的答案while
将会非常慢。
quanta 的答案awk
应该有效。我不知道为什么它不会,除非你的行尾是非 Unix 的,或者 file1 很大。
答案4
GNU coreutils 服务器命令join
正好用于此目的,但它对其输入很挑剔。
$ sort file1 > sorted1
$ sort file2 > sorted2
$ join -t" " sorted1 sorted2 | sort -n
该join
命令要求其输入文件按字典顺序排序,而不是按数字排序。因此,所有输入和输出都进行了排序。
要指定输出join
应以制表符分隔,请使用-t"
制表符"
,您可以Ctrl-V
Tab
在 Bash 提示符下输入。