bash: 一致する番号を入れ替え、ユーザー名は 2 番目のファイルに含まれる

bash: 一致する番号を入れ替え、ユーザー名は 2 番目のファイルに含まれる

投稿された結果を取得するには、「ファイル 1」の各行の最後の数字を「ファイル 2」の一致するユーザー名に置き換えます。

ファイル1:

28/02/13 46.149002259
22/03/13 68.234001404
14/03/16 69.83500766
29/01/14 87.083008540
14/03/16 106.516006874
14/03/16 201.552002260
03/12/12 207.521011278
18/08/16 234.7780151002

ファイル2:

ユーザー5874
ユーザー2404
ユーザー81002
ユーザー4540
ユーザー1259
ユーザー6260
ユーザー7278
ユーザー366

これは「ファイル 2」の一部にすぎません。実際には、ファイルにはさらに多くのユーザーが含まれています。

結果:

28/02/13 46.149002 ユーザー1
22/03/13 68.234001 ユーザー2
14/03/16 69.835007 ユーザー3
29/01/14 87.083008 ユーザー4
14/03/16 106.516006 ユーザー5 14/03/16 201.552002 ユーザー
6 03/12/12 207.521011
ユーザー7
18/08/16 234.778015 ユーザー8

答え1

ファイルは、スペースのみが列を区切る (ユーザー名などにはスペースがない) という厳密な形式になっていると想定します。これで動作するはずです (少なくとも Linux では、私のテストベッドは Kubuntu です)。

while read date value number ; do printf "%s %s %s\n" "$date" "$value" "$(grep " $number" file2 | head -n 1 | cut -f 1 -d " ")" ; done <file1

説明:

  1. コマンドはfile1… <file1)から読み取ります。
  2. 行( )が読み取れればwhile read …
  3. printf …… 3 番目のフィールドを次のように置き換えて出力します ( )。
  4. $( … )…の 効果…
    1. file2… ( )内に指定された数字を含む行を検索します。grep …先頭のスペースに注意してください: " $number") …
    2. … 最初に一致したものだけが採用されます (head …念のため )、…
    3. …すると最初の列だけが残ります(cut …)。

関連情報