열에서 특정 일치 키워드를 선택하고 마지막 열에 붙여넣습니다. - Linux

열에서 특정 일치 키워드를 선택하고 마지막 열에 붙여넣습니다. - Linux

세 번째 열에 정확한 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})_/

(추가 제약 조건을 처리하기 위해 정규식을 조정하고 싶을 수도 있습니다)

관련 정보