隣接する反復数を含む行を見つける方法

隣接する反復数を含む行を見つける方法

データがこのようなファイルにあるシナリオがあります。

データ:

1234 2271 4423
8901 1234 2569
1234 5678 9107
1134 7896 6780

出力は次のようになります。

    1234 2271 4423
    8901 1234 2569
    1134 7896 6780

行全体を検索する必要があり、隣接する数字が繰り返される場合は行全体を表示します。 「隣接する」数字はスペースで区切ることができます(他の数字では区別できません)。

たとえば、

1234 2271 4423  -> in this 2271 -> [2][2] 71 -> the 2 digit is adjacently repeated.

同様に、別の隣接する重複があります - > 4423 - > [4] [4] 23

1134 7896 6780
In this also -> [1][1]34 and 789[6] [6]780

私はこの解決策を得ました。誰かが正確に何を意味するのか、そして他の簡単な方法を説明できますか?いくつかのアイデアを得るために正しい説明を共有して提供してください。

command 1 : grep '\([0-9]\) *\1'
command 2 : grep '\([0-9]\)\s*\1'
command 3 : grep  '\(\d\)\s*\1'
command 4 : grep -e '([0-9])\1' -e '([0-9]) \1'

答え1

grep私が正しく理解したなら、これはGNUの可能性です。

grep -P "([0-9])[[:blank:]]?\1" file

出力:

1234227144二十三
8901 1234 2569
11347896 6780

答え2

逆参照と疑問符数量子を使用するのと同じくらい面白いことはありませんが、パイプと単純な正規表現を使用してこれを行うことができます。これはIMHOを理解するのが簡単であるという利点があります。

tr -d ' ' | egrep '00|11|22|33|44|55|66|77|88|99' | sed -r 's/..../& /g'

または、sedですべての操作を実行できますが、読みにくいです。

sed -r 's/ //g;/00|11|22|33|44|55|66|77|88|99/!d;s/..../& /g'

これらすべての基本的な概念は、数字の間のスペースを削除し、単純な正規表現を使用して行を隣接する数字と一致させてからスペースを入れ直して印刷することです。

答え3

次のawk手順が機能します。

awk '{buf=gensub(/ */,"","g",$0); split(buf,chars,""); last=chars[1];
      for (i=2;i<=length(buf);i++) {if (chars[i]==last) {print; next}; last=chars[i]}}' test.txt

これにより、まず入力行のすべてのスペースが削除され、結果が文字列に保存されますbuf。その後、buf個々の文字配列に分割されますchars。連続した文字があることを確認するために解析されます。その場合は、その行を印刷します。

(正規表現の逆参照に依存しない解決策は次のとおりです。)

関連情報