![bash: 一致する番号を入れ替え、ユーザー名は 2 番目のファイルに含まれる](https://rvso.com/image/1539555/bash%3A%20%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E7%95%AA%E5%8F%B7%E3%82%92%E5%85%A5%E3%82%8C%E6%9B%BF%E3%81%88%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E3%81%AF%202%20%E7%95%AA%E7%9B%AE%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%20.png)
投稿された結果を取得するには、「ファイル 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
説明:
- コマンドは
file1
(… <file1
)から読み取ります。 - 行( )が読み取れれば
while read …
… printf …
… 3 番目のフィールドを次のように置き換えて出力します ( )。$( … )
…の 効果…file2
… ( )内に指定された数字を含む行を検索します。grep …
先頭のスペースに注意してください:" $number"
) …- … 最初に一致したものだけが採用されます (
head …
念のため )、… - …すると最初の列だけが残ります(
cut …
)。