以下は同僚から提供された 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 つのフィールドで始まっていない行はすべてスキップされ、したがって空行もスキップされます。