bash:交換符合的數字,使用者名稱包含在第二個檔案中

bash:交換符合的數字,使用者名稱包含在第二個檔案中

我想用“文件 2”中匹配的用戶名替換“文件 1”中每行的最後一個數字,以獲得發布的結果。

文件1:

2013年2月28日 46.149002第259章
2013年3月22日 68.234001404
2016 年 3 月 14 日 69.83500766
29/01/14 87.083008540
2016 年 3 月 14 日 106.516006第874章
2016年3月14日 201.552002260
2012年3月12日 207.521011278
2016年8月18日 234.7780151002

文件2:

用戶5第874章
用戶2404
用戶81002
用戶4540
用戶1第259章
用戶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 14106416410652105/10651 使用者 / 1.552 002 用戶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. ... 搜尋 ( 內包含給定數字的行file2grep …注意前導空格: " $number") ...
    2. ....其中只進行第一個配對(head …,以防萬一),...
    3. ……然後只剩下第一列 ( cut …)。

相關內容