bash:交换匹配的数字,用户名包含在第二个文件中

bash:交换匹配的数字,用户名包含在第二个文件中

我想用“文件 2”中匹配的用户名替换“文件 1”中每行的最后一个数字,以获取发布的结果。

文件 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 …),并将第三个字段替换为…
  4. $( … )…的 效果…
    1. file2… 在(内搜索包含给定数字的行grep …,注意前导空格:) " $number"
    2. … 仅取第一个匹配项(head …,以防万一),…
    3. ... 然后就只剩下第一列了 ( cut …)。

相关内容