在另一个文件中搜索 AWK 的输出

在另一个文件中搜索 AWK 的输出

我有两个文件fileA和fileB。

我必须从文件 A 中提取列 1 awk '{print $1}',然后将输出搜索到其他文件 B 中,并将匹配的记录保存到新文件文件 C 中,简单来说如下:

fileA

seg1     rec1
seg2     rec2
seg3     rec3 

我需要使用 awk 命令检索第 1 列,并搜索第 1 列fileB以检索如下记录:

fileB

seg1     one
seg2     two
seg3     three
seg4     four
seg5     five

从文件 A 中提取列 1 数据,并使用该数据在文件 B 中搜索,并将匹配的记录保存到测试文件中。我的输出应该是这样的:

fileC

seg1       one
seg2       two
seg3       three

答案1

awk可以通过以下方式轻松实现:

awk 'NR==FNR{inFileA[$1]; next} ($1 in inFileA)' fileA fileB > write_to_fileC

结果,

seg1       one
seg2       two
seg3       three

在上面,我们首先阅读文件A并将整个列 1 保存到名为档案,然后在文件B中查找它的第一列,如果它与文件A中保存的第一列匹配,则打印文件B的整行。

答案2

如果要比较的列已排序,则可以使用join

join -o 2.1,2.2 file1 file2

join匹配输入文件中的已排序列并打印它们。-o 2,1,2.2将输出限制为第二个输入文件的第一列和第二列。

答案3

您可以使用以下一行代码:

cut -f1 fileA | grep -f - fileB > fileC
  • cut命令将提取第一列fileA(假设制表符分隔。用于-d指定其他内容)
  • grep命令获取输出cut并搜索fileB所有字符串。
  • 输出将被写入fileC

答案4

您已经收到了一些非常好的答案。为了补充,下面是一个 Perl 方法:

$ perl -ane '$i ? $k{$F[0]} && print : { $k{$F[0]}++ }; $i++ if eof' fileA fileB
seg1     one
seg2     two
seg3     three
    

还有一个高尔夫版的αғsнιη 的回答

$ awk 'NR==FNR ? a[$1] : $1 in a' fileA fileB 
seg1     one
seg2     two
seg3     three

这是一个有点复杂的grep解决方案:

$ grep -Ff <(grep -oP '^\S+' fileA) fileB
seg1     one
seg2     two
seg3     three

相关内容