Shell-Script
在文件 2 和文件 3 中查找文件 1 中的記錄
我有三個文件
file1.txt
,file2.txt
,file3.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 個欄位進行操作。首先加入
file2
andfile3
,然後結果將被加入file1
並刪除+
符號sed