我有一个以下格式的文本文件:
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>
t
while
¹ GNUisms 中的:
命令后面跟着另一个命令,在标准中sed
你需要单独的-e
表达式,-E
(实际上是 BSDism),\<
/ \>
(实际上是 ex/vi'ism,其他一些sed
支持[[:<:]]
,[[:>:]]
或\b
作为等价物)。