다음은 내 동료가 제공한 Perl 명령입니다.
{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;}
그는 빈 행을 제거하고 처음 5개 필드의 숫자를 확인하는 데 사용된다고 말했습니다.
미리 감사드립니다.
답변1
그러면 필드가 물결표로 구분되어 있나요? 흥미로운 점은 줄 사이의 구분 기호입니다. 이는 \n
개행 문자이지만 개행 문자는 아닙니다.
설명은 다음과 같습니다.
이 s/^/\\n/
명령은 다음으로 시작하는 줄을 바꿉니다.\n
if
$.>1
줄 번호는 1( ) 보다 커야 합니다 .- 줄에는 물결표로 구분된 숫자가 5개 이상 포함되어야 합니다.
그 후에는 모든 줄(빈 줄 제외(매개변수로 방지 -l
))이 인쇄됩니다( printf "%s", $_
). 코드는 처음 5개 필드에 숫자가 포함된다는 것을 보장하지 않습니다!
user@pc:/tmp$ cat inputfile.txt
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
1~2~3~4
b~2~3
user@pc:/tmp$ perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename
1~2~3~4~5\n6~7~8~9~0\n1~2~3~4~51~2~3~4b~2~3user@pc:/tmp$
명령 주위의 중괄호와 관련하여 다른 곳에서 호출하고 싶을 수도 있습니다. 숫자가 포함된 5개 필드의 존재를 보장하는 또 다른 (아마도 더 짧은) 버전은 다음과 같습니다.
user@pc:/tmp$ perl -ne 'next unless (/^\d+~\d+~\d+~\d+~\d+/); print $_;' inputfile.txt
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
user@pc:/tmp$
이 5개 필드로 시작하지 않는 모든 줄을 건너뛰므로 빈 줄은 건너뜁니다.