如果有相应的行号,则显示文件内容

如果有相应的行号,则显示文件内容

我有两个以下格式的文件:

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打印其他行。此外,无需保存生成的脚本,您可以将其通过管道传输到seds 之间:

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值为$1next告诉 awk 跳过其余命令并从下一行重新开始。

  • FNR in seen

    在读取第二个文件时,如果行号在 中,则打印任何行seen

    FNR in seen是一个条件。如果行号 FNR 是数组中的键,则计算结果为 true seen。由于我们没有为此条件指定任何操作,因此将采取默认操作,即打印该行。

答案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

为了使其正常工作,两个文件都需要根据连接字段(此示例中的第一列)进行排序。

干杯!

相关内容