如何將與另一列相符的列新增到文件中?

如何將與另一列相符的列新增到文件中?

如何根據第二列中的數字將文件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與第一個文件相符。

相關內容