如何根據第二列中的數字將文件1中的第一列與文件2配對?
文件文件1
k002 25
k004 54
k003 23
文件文件2
25 h
23 j
54 hg
所需輸出
k002 25 h
k003 23 j
k004 54 hg
我不知道該怎麼做,也沒有找到類似的問題。
awk 'matching {print ... $1, $2}' file1 file2 > file_des
答案1
你也許可以這樣做:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
在哪裡:
FNR
:目前輸入檔中的輸入記錄號。NR
:到目前為止看到的輸入記錄總數。
請注意,這會將整個讀file1
入記憶體。
答案2
如果您不關心保留原始文件順序,您可以使用join
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
或者正如 @Ed Morton 所建議的,如果您使用bash
或任何其他支援進程替代的 shell,您可以避免以這種方式建立臨時檔案:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
答案3
使用awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
在此命令中NR==FNR
,請確保{ar[$2]=$0;next}
僅適用於第一個文件,因為讀取第一個文件後將FNR
被設置為零。在表達式中,建立了{ar[$2]=$0;next}
一個索引數組ar
,$2
並且next
不採取進一步的操作。
此表達式($1 in ar)
檢視$1
(第二個檔案的第一個欄位)是否存在於指數的 數組ar
.如果存在,則ar
透過此語句列印第二個檔案的第二個欄位{print ar[$1],$2}
。
($1 in ar)
很重要,因為這意味著第二個檔案的 $1 是否匹配指數的ar
。並ar
在第一個檔案的 $2 上建立索引。因此,這將檢查$1
第二個文件是否$2
與第一個文件相符。