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)
如何?
Cvia副本的任何行/C.*C/pC孔/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 ''.)