查找文件 1 中以及文件 2 和文件 3 中存在的记录

查找文件 1 中以及文件 2 和文件 3 中存在的记录

我有三个文件,,file1.txt它们的格式相同。file2.txtfile3.txt

我想分别根据第 2 列和第 3 列选择同时file1.txt存在于输出文件中的记录。file2.txtfile3.txtout.txt

另外,我需要创建另一个文件 ,out2.txt其中包含其他列(来自 的第 4 列file2.txt,来自 的第 5 列file3.txt)。

输入示例:

file1.txt

1. abc 1 a f11 f13 f14 
2. abd 2 b f12 f14 f13  
3. abe 4 d f13 f16 f12 
4. acf 6 s f14 f15 f19

file2.txt

 1. abc 1 a f21 f23 f24 
 2. abd 1 b f21 f24 f23  
 3. abe 4 d f24 f26 f22 
 4. acf 6 s f23 f25 f29

file3.txt

 1. abc 1 a f31 f33 f34 
 2. abd 2 b f31 f34 f33  
 3. acf 5 s f33 f35 f39 
 4. abe 4 d f34 f36 f32

所需输出

out.txt

 1. abc 1 a f11 f13 f14 
 2. abe 4 d f13 f16 f12 

out2.txt

 1. abc 1 a f11 f13 f14 f21 f31
 2. abe 4 d f13 f16 f12 f24 f34

答案1

您可能想检查一下地点关于 diff3,您可以使用此程序比较 3 个文件作为示例输出:

$ diff3 parent.txt your.txt mine.txt

 ==== 

1:1,2c Hello, 

This is parent file.

2:1,2c Hello, 

This is your file. 

3:1,2c Hello, 

This is my file.

您可以使用

diff3 file1.txt file2.txt file3.txt > output.txt

答案2

要选择所有文件中的共享行,您可以使用grep( out.txt)

grep -ho ' [0-9] [a-z] ' file3 | grep -Fof - file2 | grep -Ff - file1

选择可操作字段(作为变体)并使用它在 next和cut -d' ' -f3,4 file3中搜索它。file2file1

像往常一样加入 2 个文件使用join命令(惊喜!)(out2.txt

join -j 3 <(sort -k3,4 file1 | sed 's/ /+/3') \
          <(join -j 3 <(sort -k3,4 file2 | sed 's/ /+/3') \
                      <(sort -k3,4 file3 | sed 's/ /+/3') \
                      -o '1.4 2.4 1.3') \
          -o '1.1,1.2,1.3,1.4,1.5,2.1,2.2' | sed 's/+/ /'

因此,要将第三个和第四个字段一起操作,我们必须将其连接起来(+例如通过符号)。由于join仅对已排序的行进行操作,因此我们sort按第三个和第四个字段进行操作。
首先加入file2file3,然后结果将与 加入file1并删除+符号sed

答案3

可能的解决方案awk(如果需要,我会进行编辑,因为从您的问题中不清楚具体要求是什么):

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = 0; z[$2,$3] = $5;
    next; 
}
FILENAME == ARGV[2] {
    if (($2,$3) in m) {
        m[$2,$3] = 1;
        z[$2,$3] = $5 " " z[$2,$3];
    }
    next;
}
{
    if (($2,$3) in m && m[$2,$3] == 1) {
        print $0 >"out.txt";
        print $0 " " z[$2,$3] >"out2.txt";
    }
}' file3.txt file2.txt file1.txt

我们读取第三个文件,使用键列 2 和列 3 创建两个数组,第一个数组用零填充,第二个数组用文件 out2.txt 所需的值填充。然后我们读取第二个文件,并检查第 2 列和第 3 列中的键是否存在于第一个数组中,如果是,我们将值从零更改为 1,并将所需值连接到文件 out2.txt 的第二个数组中。最后,我们读取第一个文件,检查现有密钥,然后在文件 out.txt 和 out2.txt 中打印有趣的值,如下所示:

输出.txt应包含:

1. abc 1 a f11 f13 f14
3. abe 4 d f13 f16 f12

输出2.txt应包含:

1. abc 1 a f11 f13 f14 f21 f31
3. abe 4 d f13 f16 f12 f24 f34

相关内容