비슷한 레이아웃의 수천 개의 문자열이 포함된 .txt 문서가 있는데 일부 행에 원하지 않는 추가 정보가 포함되어 있습니다.
예는 다음과 같습니다.
202212_08,ABC123/A1234,AB,,C123
202212_08,CDEF1233/A5678,FG,,C345
출력이 다음과 같기를 원합니다.
20221208,ABC123,C123
20221208,CDEF1233,C344
정규식을 사용해 보았지만 계속 오류가 발생하고 출력이 비어 있습니다. 당신의 도움을 주셔서 감사합니다.
답변1
그리고 sed
:
$ sed -e 's:/.*,:,:' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
이렇게 하면 /
줄의 첫 번째 문자부터 줄의 마지막 문자까지 ,
모든 내용이 단일 문자로 대체됩니다 ,
.
그러나 입력 데이터에 여러 필드가 포함된 경우 일반적으로 awk 또는 perl을 사용하는 것이 더 좋습니다. 각 필드를 개별적으로 조작 및/또는 인쇄할 수 있기 때문입니다.
예를 들어, 다음 awk 스크립트는 내장 함수를 사용하여 /.*
각 입력 줄에서 두 번째 필드를 제거한 다음 첫 번째( ), 두 번째( ) 및 마지막( ) 필드를 인쇄합니다.sub()
$1
$2
$NF
$ awk -F, -vOFS=, '{sub(/\/.*/,"",$2); print $1, $2, $NF}' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
아니면 펄을 사용하세요:
$ perl -F, -lane '$F[1] =~ s:/.*::; print join(",",@F[0,1,-1])' input.txt
202212_08,ABC123,C123
202212_08,CDEF1233,C345
이 -F,
옵션은 필드 구분 기호(awk와 유사)를 설정하며, 이 -a
옵션을 사용하면 입력이 자동으로 이름이 지정된 배열로 분할됩니다 @F
. Perl의 줄 끝 자동 처리(예: 개행 문자 또는 ) -l
를 활성화하고 Perl이 그렇게 작동하도록 만드세요 . Perl에게 다음 인수가 실행될 스크립트임을 알려줍니다.\n
-n
sed -n
-e
$F[1]
Perl 배열 인덱싱은 배열 의 두 번째 요소와 마찬가지로 1이 아닌 0에서 시작하며 @F
배열 슬라이스는 @F[0,1,-1]
배열의 첫 번째, 두 번째 및 마지막 요소입니다.