sed는 n번째 문자가 특정 문자가 아닌 경우 줄을 삭제합니다.

sed는 n번째 문자가 특정 문자가 아닌 경우 줄을 삭제합니다.

csv 파일이 있는데 12번째 문자가 아닌 경우 행을 삭제하고 싶습니다 ;.

예를 들어 내 파일은 다음과 같습니다.

2266308;A;B;dfsgsfdg    
2266309;A;BJHSADFK;gfsdg
2266310;A;B;dfg

그리고 나는 원한다:

2266308;A;B;dfsgsfdg
2266310;A;B;dfg

12번째 문자가 sed의 문자가 아닌 경우 이 줄을 어떻게 삭제합니까 ;? =)

답변1

12번째 문자가 아닌 모든 줄을 삭제하려면 ;다음을 수행하세요.

 $ sed -E '/^.{11}[^;]/d' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

또는 원본 파일을 편집합니다( sed지원하는 경우 -i).

$ sed -iE '/^.{11}[^;]/d' file

sed지원하지 않는 경우 -E:

sed -i '/^.\{11\}[^;]/d' file

하지만 csv 파일이므로 문자수 대신 필드를 사용하는 것이 훨씬 안전합니다. 예를 들어, awk세 번째 필드가 한 문자 길이인 모든 줄을 인쇄하려면 다음을 사용하고 지시하십시오.

$ awk -F';' 'length($3)==1' file
2266308;A;B;dfsgsfdg    
2266310;A;B;dfg

최신 GNU awk를 사용하면 파일을 제자리에서 편집할 수 있습니다.

 awk -iinplace -F';' 'length($3)==1' file

이는 이전 필드의 길이 변화에 강인하다는 장점이 있습니다. 이 sed방법과 달리 줄에 공백이 있거나 처음 두 필드 중 하나가 예상보다 길거나 짧은 경우에는 실패하지 않습니다. 일반적으로 데이터가 필드로 구분된 경우 문자 위치보다 필드를 사용하는 것이 좋습니다.

관련 정보