Perlスクリプトは、連続する2行の最初の文字を比較し、最初の2文字が同じ場合は2行目を無視します。

Perlスクリプトは、連続する2行の最初の文字を比較し、最初の2文字が同じ場合は2行目を無視します。

誰もがテキストファイル内の2つの連続した行の最初の文字を比較し、最初の文字がすべて同じ場合、2行目を無視/削除し、最初の行だけを新しいファイルに印刷するのに役立ちますか?

#1001
#1002
mango
orange
grape
#1003

を削除したいと思います#1002

答え1

uniqGNUと-wオプション1の使用:

  -w, --check-chars=N
          compare no more than N characters in lines

連続して繰り返される行を省略し、最初の文字のみを比較できます。

uniq -w1 infile >outfile

1. マルチバイト文字では正しく動作しません。以下のStéphaneのメモをご覧ください。

答え2

perl -C -ne '$c = substr($_,0,1);
             print unless $c eq $l;
             $l = $c;' < file.in > file.out

答え3

sed '$n;h;N;/^\(.\).*\n\1/g;/\n/P;//!G;D' <in >out

sedこれを実行できるスクリプトがあります。

仕組みは次のとおりです。

  1. 現在の行が最後の行の場合は、標準出力として印刷してスクリプトを終了します。
  2. そうでない場合は、現在の行のコピーを保存してスペースを保存してください。
  3. 次に、次の入力ラインをパターン空間に追加します。
  4. パターンスペースの最初の文字が追加された行の最初の文字と同じ場合、予約済みスペースの保存されたコピーでパターンスペースを上書きします。
  5. そうでない場合は、パターンスペースにまだ線があり、\nその場合はその点まで印刷する必要があります。
  6. それ以外の場合は、パターンスペースに保存した行の別のコピーを追加します。
  7. とにかく、パターンスペースから最初の改行文字を削除し、残りはスクリプトの先頭から始めてください。

デフォルトでは、一度に2行を操作して、2行目の最初の文字が最初の行の最初の文字と一致しない場合は、最初の行のみを印刷し、同じ文字でシリーズの最初の文字を再帰的に上書きします。これにより、最小限のバッファリングですべてのサイズの入力を迅速かつ効率的に処理でき、すべてのサイズの最初の文字一致系列を最初の出現に圧縮できます。リアルタイム入力またはファイルを使用しますが、現在の行と次の行のコピーを読み取るか保存するだけです。

答え4

perl -0777 -pe '1 while s/^(.)(.*)\n\1.*/$1$2/gm' file.in >file.out

これは、一致するものが見つからなくなるまでファイル全体を食べて繰り返します。

関連情報