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作为等价物)。

相关内容