세 번째 열에 정확한 5자리 숫자가 포함된 CSV 형식의 데이터가 있습니다. 이 번호를 복사하여 마지막 열에 붙여넣어야 합니다.
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})_
다음 사이의 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})_/
(추가 제약 조건을 처리하기 위해 정규식을 조정하고 싶을 수도 있습니다)