다음은 내 동료가 제공한 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개 필드로 시작하지 않는 모든 줄을 건너뛰므로 빈 줄을 건너뜁니다.