我有 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})_/
(我们可能想调整正则表达式来处理额外的约束)