Shell-Script

從一列中選擇特定的匹配關鍵字並將其粘貼到最後一列-Linux

  • May 25, 2020

我有 CSV 中的數據,其中第 3 列包含確切的 5 位數字。需要複製此號碼並粘貼到最後一列。

2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.   
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.   
2020-05-19_19:03:07,200,   
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.   

輸出:

2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622   
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840   
2020-05-19_19:03:07,200,,   
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638  

我嘗試使用 sed 搜尋 5 位數字,但由於它也有字元,所以它不起作用。

sed -n '/\b[0-9]\{5\}\b/p'
$ sed -E 's/_([0-9]{5})_(.*)$/_\1_\2,\1/' file
2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840
2020-05-19_19:03:07,200,
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638
  • _([0-9]{5})_匹配之間的五位數字_
  • (.*)$匹配到行尾
  • _\1_\2,\1恢復原始部分 ( _\1_\2) 然後追加,\1

您在問題中的範例數據有尾隨空格字元。如果您的實時數據使用也是這種情況

sed -E 's/_([0-9]{5})_(.*\.)[[:blank:]]+$/_\1_\2,\1/' file

而是去除尾隨空格。

你可以使用 awk’s match- 比如

$ awk -F, 'BEGIN{OFS=FS} match($3,/_[0-9]{5}_/){$(NF+1) = substr($3,RSTART+1,RLENGTH-2)} 1' file.csv
2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840
2020-05-19_19:03:07,200,
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638

在匹配項中包含前導和尾隨下劃線,然後用 修剪它們,以substr確保您不會匹配該欄位中其他位置的 5 位數字序列。

引用自:https://unix.stackexchange.com/questions/588850