我有两个文件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