如果行只包含一次字符,如何删除行

Nam*_*amz 10 linux sed awk text-processing

我想从只包含一次特定字符的文件中删除一行,如果它出现多次或不存在,则将该行保留在文件中。

例如:

DTHGTY
FGTHDC
HYTRHD
HTCCYD
JUTDYC
Run Code Online (Sandbox Code Playgroud)

在这里,我想删除的字符是C这样,命令应该删除行FGTHDCJUTDYC因为它们C恰好只有一次。

我如何使用sed或来做到这一点awk

fed*_*qui 20

awk您可以将字段分隔符设置为任何内容。如果您将其设置为C,那么您将拥有与 出现次数一样多的字段 +1 C

所以如果你说awk -F'C' '{print NF}' <<< "C1C2C3"你得到4:CCC包含在 3C秒内,因此有 4 个字段。

您想删除只C出现一次的行。考虑到这一点,在您的情况下,您将要删除那些恰好有两个C字段的行。所以只需跳过它们:

$ awk -F'C' 'NF!=2' file
DTHGTY
HYTRHD
HTCCYD
Run Code Online (Sandbox Code Playgroud)

  • 巧妙地使用 `awk` 字段分隔符! (4认同)
  • @OlivierDulac,是的,空间是专门处理的 [按照 POSIX 的规定](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04)。 (2认同)

Rom*_*est 8

sed方法:

sed -i '/^[^C]*C[^C]*$/d' input
Run Code Online (Sandbox Code Playgroud)

-i 选项允许就地文件修改

/^[^C]*C[^C]*$/- 匹配C只包含一次的行

d - 删除匹配的行


Ste*_*uch 8

这可以通过以下方式完成sed

代码:

sed '/C.*C/p;/C/d' file1
Run Code Online (Sandbox Code Playgroud)

结果:

DTHGTY
HYTRHD
HTCCYD
Run Code Online (Sandbox Code Playgroud)

如何?

  1. 匹配并打印至少有两份Cvia副本的任何行/C.*C/p
  2. 删除任何带有过C/C/d的行,这包括步骤 1 中已打印的行
  3. 默认打印其余的行

  • 巧妙的替代方法;我喜欢。 (2认同)

tri*_*eee 6

这将删除仅出现一次 C 的行。

grep -v '^[^C]*C[^C]*$' file
Run Code Online (Sandbox Code Playgroud)

正则表达式[^C]匹配一个不是 C(或换行符)的字符,重复运算符(又名 Kleene 星)*指定前一个表达式的零次或多次重复。

grep(和大多数其他面向文本的工具)的默认输出是标准输出;重定向到一个新文件,如果这是您想要的,可以将其移动到原始文件的顶部。相同的正则表达式可用于sed -i就地编辑:

sed -i '/^[^C]*C[^C]*$/d' file
Run Code Online (Sandbox Code Playgroud)

(在某些平台上,特别是 *BSD 包括 macOS,该-i选项需要一个参数,例如-i ''.)

  • 或者`grep -vx '[^C]*C[^C]*'` (2认同)