我有两个以下格式的文件:
File A
4
5
8
9
File B
1 text
2 text1
3 text2
4 text3
5 text4
6 text5
7 text6
8 text7
9 text8
我想要的输出仅如下(如果文件 B 中的第二个字段对应于文件 A 中的行号,则为文件 B 中的第二个字段):
test3
test4
text7
text8
答案1
您可以sed
通过将 附加到每一行来从文件 A 创建一个简单的脚本p
,然后在另一个文件中运行该脚本sed
而不-n
打印其他行。此外,无需保存生成的脚本,您可以将其通过管道传输到sed
s 之间:
sed 's/$/p/' A | sed -nf- B
答案2
$ awk 'FNR==NR{seen[$1];next;} FNR in seen' FileA FileB
text3
text4
text7
text8
怎么运行的
FNR==NR{seen[$1];next;}
在读取第一个文件时,这会将每个数字作为键添加到关联数组中
seen
。FNR 是当前文件的行号,NR 是所有读取行中的行号。因此
FNR==NR
,当 时,我们仍在读取第一个文件,FileA
在本例中。seen[$1]
创建一个键,seen
值为$1
。next
告诉 awk 跳过其余命令并从下一行重新开始。FNR in seen
在读取第二个文件时,如果行号在 中,则打印任何行
seen
。FNR in seen
是一个条件。如果行号 FNR 是数组中的键,则计算结果为 trueseen
。由于我们没有为此条件指定任何操作,因此将采取默认操作,即打印该行。
答案3
您正在执行关系“连接”操作,因此请使用标准 UNIXjoin
命令:
$ join fileA.txt fileB.txt
4 text3
5 text4
8 text7
9 text8
要仅从第二个文件中获取第二个字段,请添加-o 2.2
:
$ join -o 2.2 fileA.txt fileB.txt
text3
text4
text7
text8
为了使其正常工作,两个文件都需要根据连接字段(此示例中的第一列)进行排序。
干杯!