以下是我同事给的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$
它将跳过所有不以这五个字段开头的行,因此跳过空行。