根据前缀从文件中提取行

根据前缀从文件中提取行

我需要从 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==NRawk: 仅在读取时才为真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 提示符下输入。

相关内容