从一列中选择特定的匹配关键字并将其粘贴到最后一列 - Linux

从一列中选择特定的匹配关键字并将其粘贴到最后一列 - Linux

我有 CSV 格式的数据,其中第三列包含精确的 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'

答案1

你可以使用 awk 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 位数序列。

答案2

$ 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

而不是去除尾随空格。

答案3

$ perl -nle 'print "$_,",/_(\d{5})_/' ex
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

对于输入中的每一行 perl -nle

  • 打印它和一个“,”print "$_,"
  • 以及该行中存在的数字/_(\d{5})_/

(我们可能想调整正则表达式来处理额外的约束)

相关内容