Shell-Script

在文件 2 和文件 3 中查找文件 1 中的記錄

  • March 9, 2019

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

我想分別從第 2 列和第 3 列中都存在的記錄中選擇file1.txt輸出文件。file2.txt``file3.txt``out.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

您可能想使用此程序查看有關 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

要在所有文件中選擇共享行,您可以使用grep( out.txt)

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

選擇可操作欄位(作為變體cut -d' ' -f3,4 file3)並使用它在 nextfile2和中搜尋它file1

像往常一樣加入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/+/ /'

所以要一起操作第 3 和第 4 個欄位,我們必須將它連接起來(通過+符號 eg)。由於join僅對已排序的行進行操作,因此我們sort按第 3 和第 4 個欄位進行操作。

首先加入file2and file3,然後結果將被加入file1並刪除+符號sed

引用自:https://unix.stackexchange.com/questions/204094