Ниже приведена команда perl, данная моим коллегой.
{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;}
Он сказал, что это для удаления пустых строк и проверки первых пяти полей на наличие числа.
Заранее спасибо.
решение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$
Он пропустит все строки, не начинающиеся с этих пяти полей, и, следовательно, пропустит пустые строки.