共通列に2つのファイルを結合する

共通列に2つのファイルを結合する

2つのファイルがあります。まず、

a 0.1 c t 0.4
c 0.25 g a 0.1
d 0.567 c c 0.00004
q 0.76 f c 0.05

二つ目は、

a hello
c goodbye
d morning
q hungry

次のようにファイルを作成したいと思います。

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

どうすればいいですか?

答え1

この試み、

ファイルがソートされているので、join次のコマンドを直接使用できます。

 join  Second First | cut -f2- -d' '

hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

ソートされていない場合は、次のコードを使用してください。

join  <(sort second) <(sort first) | cut -f2- -d' '
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

答え2

awk最初の列のみを使用するように2番目のファイルを処理し、最初のファイルを使用して埋める方法は非常に簡単です。

awk 'FNR == NR { map[$1] = $2; next } ($1 in map) { $1 = map[$1] }1 ' second first

答え3

別のjoin方法は、結合の組み込み機能を使用することです。

$ join -o 2.2,1.2,1.3,1.4,1.5  <(sort file1) <(sort file2)
hello 0.1 c t 0.4
goodbye 0.25 g a 0.1
morning 0.567 c c 0.00004
hungry 0.76 f c 0.05

-o出力形式を指定できます。ここではjoin、ファイル2()の2番目のフィールドを使用してから、ファイル1(2.2)の最初、2番目、3番目、4番目、および5番目のフィールドを使用するように指示します1.2,1.3,1.4,1.5

答え4

ペーストを使用してください。

paste <(cut -d ' ' -f2- file2) <(cut -d ' ' -f2- file1)

シェルを使用してください。

while IFS= read -r file2 <&3; do 
  IFS= read -r file1
  printf '%s %s\n' "${file2##* }" "${file1#* }"
done 3<file2 <file1

ガイドライン

  • どちらもソートされておらず、大容量ファイル/データが関連しているとシェルが遅くなります。

  • インデントなしで書式を直接貼り付けます。

関連情報