Nam*_*amz 10 linux sed awk text-processing
我想从只包含一次特定字符的文件中删除一行,如果它出现多次或不存在,则将该行保留在文件中。
例如:
DTHGTY
FGTHDC
HYTRHD
HTCCYD
JUTDYC
Run Code Online (Sandbox Code Playgroud)
在这里,我想删除的字符是C
这样,命令应该删除行FGTHDC
,JUTDYC
因为它们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)
sed方法:
sed -i '/^[^C]*C[^C]*$/d' input
Run Code Online (Sandbox Code Playgroud)
-i
选项允许就地文件修改
/^[^C]*C[^C]*$/
- 匹配C
只包含一次的行
d
- 删除匹配的行
这可以通过以下方式完成sed
:
代码:
sed '/C.*C/p;/C/d' file1
Run Code Online (Sandbox Code Playgroud)
结果:
DTHGTY
HYTRHD
HTCCYD
Run Code Online (Sandbox Code Playgroud)
如何?
C
via副本的任何行/C.*C/p
C
孔/C/d
的行,这包括步骤 1 中已打印的行这将删除仅出现一次 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 ''
.)