尝试根据两个文件中的第一列连接两个文本文件,并希望保留第二个文件中匹配项的所有列
Trying to join two text files based on the first column in both files and want to keep all the columns of the matches from the second file
我正在尝试根据第一列连接两个文本文件,如果这些列相同,我想保留第二个文件中的所有列。
List1.txt
action
adan
adap
adapka
adat
yen
List2.txt
action e KK SS @ n
adham a d h a m
adidas a d i d a s
administration e d m i n i s t r e SS @ n
administrative e d m i n i s t r e t i v
admiral e d m aj r @ l
adnan a d n a n
ado a d o
adan a d @ n
adap a d a p
adapka a d a p k a
adrenalin @ d r e n @ l i n
adrian a d r j a n
adat a d a t
adtec e d t e k
adult @ d a l t
yen j e n
我想从 list1.txt
中获取与 list2.txt
匹配的所有内容以及 list2.txt
中的所有其他列。 List3.txt
应该是这样的。
List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
我尝试了来自 的以下命令:
$awk -F: 'FNR==NR{a[]=[=12=];next}{if( in a){print a[];} else {print;}}' List1.txt List2.txt > List3.txt
我也试过这个:
$comm <(sort List2.txt) <(sort List1.txt)
我敢肯定有办法做到这一点是 awk,但 join 也比较简单。
join -1 1 -2 1 List1.txt <(sort -k 1,1 List2.txt) > List3.txt
您将根据第一列加入 List1
,并根据第一列加入 List2
。然后您需要确保文件按字母顺序排序,以便加入可以工作。
这会生成您想要的列,以空格分隔。
List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
另一个简单的方法来完成你正在尝试的是 grep
使用 List1.txt
中的值来匹配 fixed-string List2.txt
将结果重定向到 List3.txt
,例如
grep -Ff List1.txt List2.txt > List3.txt
如果使用 GNU grep
或 -w, --word-regex
可用,添加 -w
确保仅全字匹配,例如
grep -Fwf List1.txt List2.txt > List3.txt
结果List3.txt
$ cat List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
(注意: 所有空格都保留在 List3.txt
)
我正在尝试根据第一列连接两个文本文件,如果这些列相同,我想保留第二个文件中的所有列。
List1.txt
action
adan
adap
adapka
adat
yen
List2.txt
action e KK SS @ n
adham a d h a m
adidas a d i d a s
administration e d m i n i s t r e SS @ n
administrative e d m i n i s t r e t i v
admiral e d m aj r @ l
adnan a d n a n
ado a d o
adan a d @ n
adap a d a p
adapka a d a p k a
adrenalin @ d r e n @ l i n
adrian a d r j a n
adat a d a t
adtec e d t e k
adult @ d a l t
yen j e n
我想从 list1.txt
中获取与 list2.txt
匹配的所有内容以及 list2.txt
中的所有其他列。 List3.txt
应该是这样的。
List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
我尝试了来自
$awk -F: 'FNR==NR{a[]=[=12=];next}{if( in a){print a[];} else {print;}}' List1.txt List2.txt > List3.txt
我也试过这个:
$comm <(sort List2.txt) <(sort List1.txt)
我敢肯定有办法做到这一点是 awk,但 join 也比较简单。
join -1 1 -2 1 List1.txt <(sort -k 1,1 List2.txt) > List3.txt
您将根据第一列加入 List1
,并根据第一列加入 List2
。然后您需要确保文件按字母顺序排序,以便加入可以工作。
这会生成您想要的列,以空格分隔。
List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
另一个简单的方法来完成你正在尝试的是 grep
使用 List1.txt
中的值来匹配 fixed-string List2.txt
将结果重定向到 List3.txt
,例如
grep -Ff List1.txt List2.txt > List3.txt
如果使用 GNU grep
或 -w, --word-regex
可用,添加 -w
确保仅全字匹配,例如
grep -Fwf List1.txt List2.txt > List3.txt
结果List3.txt
$ cat List3.txt
action e KK SS @ n
adan a d @ n
adap a d a p
adapka a d a p k a
adat a d a t
yen j e n
(注意: 所有空格都保留在 List3.txt
)