Sed - 行内の重複列から数字を削除しますが、最初の方法は維持します。

Sed - 行内の重複列から数字を削除しますが、最初の方法は維持します。

次の形式のテキストファイルがあります。

c4 c4 r4 c8 c8 e2 e2 c1 
c4 c4 r4 c8 c8 c1 e2 e2 
c4 c4 r4 e2 e2 c8 c8 c1 
c4 c4 r4 e2 e2 c1 c8 c8 
c4 c4 r4 c1 e2 e2 c8 c8 
c4 c4 r4 c1 c8 c8 e2 e2 
c4 c4 c8 c8 r4 e2 e2 c1 
c4 c4 c8 c8 r4 c1 e2 e2 
c4 c4 c8 c8 e2 e2 r4 c1 
c4 c4 c8 c8 e2 e2 c1 r4 
c4 c4 c8 c8 c1 e2 e2 r4 
c4 c4 c8 c8 c1 r4 e2 e2 
c4 c4 e2 e2 c8 c8 r4 c1 
c4 c4 e2 e2 c8 c8 c1 r4 
c4 c4 e2 e2 r4 c8 c8 c1

行の重複列からすべての数字を削除したいが、値が別の数字に変更された場合でも、常に最初のアプローチを維持します。したがって、出力は次のようになります。

c4 c r c8 c e2 e c1 
c4 c r c8 c c1 e2 e 
c4 c r e2 e c8 c c1 
c4 c r e2 e c1 c8 c 
c4 c r c1 e2 e c8 c 
c4 c r c1 c8 c e2 e 
c4 c c8 c r4 e2 e c1 
c4 c c8 c r4 c1 e2 e 
c4 c c8 c e2 e r4 c1 
c4 c c8 c e2 e c1 r4 
c4 c c8 c c1 e2 e r4 
c4 c c8 c c1 r4 e2 e 
c4 c e2 e c8 c r4 c1 
c4 c e2 e c8 c c1 r4 
c4 c e2 e r4 c8 c c1

可能な数字は(1-64)です。

ベストアンサー1

GNU1を使用すると、sed次のことができます。

$ sed -Ee ':1;s/(\<[[:alpha:]]([[:digit:]])+\>[[:alpha:][:space:]]*\<[[:alpha:]])\2\>/\1/;t1' < file
c4 c r c8 c e2 e c1
c4 c r c8 c c1 e2 e
c4 c r e2 e c8 c c1
c4 c r e2 e c1 c8 c
c4 c r c1 e2 e c8 c
c4 c r c1 c8 c e2 e
c4 c c8 c r4 e2 e c1
c4 c c8 c r4 c1 e2 e
c4 c c8 c e2 e r4 c1
c4 c c8 c e2 e c1 r4
c4 c c8 c c1 e2 e r4
c4 c c8 c c1 r4 e2 e
c4 c e2 e c8 c r4 c1
c4 c e2 e c8 c c1 r4
c4 c e2 e r4 c8 c c1

perl同じ

perl -pe '1 while s/\b\pL(\d+)\b[\pL\s]*\b\pL\K\1//' < file

どちらの場合も、交換アイテムがあるたびに(または使用)<word-boundary><letter><digits><word-boundary><any-amount-of-letters-and-whitespace><word-boundary><letter><same-digits><word-boundary>同じアイテムと交換、削除、および繰り返します。<same-digits>twhile


¹GNUismsのコマンド:の後には別のコマンドが続きます。標準ではsed別々の-e表現-E(実際にはBSDism)、\</ \>(実際にはex / vi'ism、一部はsedそれをサポートする[[:<:]]か、[[:>:]]それに\b対応する表現)が必要です。

おすすめ記事