awk - 在 awk 中删除带有特殊字符的行

标签 awk

我有一个这样的文本文件:

VAREAKAVVLRDRKSTRLN 2888
ACP*VRWPIYTACGP 292
RDRKSTRLNSSHVVTSRMP 114
VAREA*KAVVLRDRRAHV*T    73

在某些行的第一列中有一个“*”。我想删除带有“*”的所有行。这是预期的输出:

预期输出:

VAREAKAVVLRDRKSTRLN 2888
RDRKSTRLNSSHVVTSRMP 114

为此,我使用了这段代码:

awk -F "\t" '{ if(($1 == '*')) { print $1 "," $2} }' infile.txt > outfile.txt

这段代码没有返回预期的输出。我该如何解决?

最佳答案

我该如何解决?

你做到了

awk -F "\t" '{ if(($1 == '*')) { print $1 "," $2} }' infile.txt > outfile.txt

通过执行 $1 == "*" 你是在问:是第一个字段 * not does first contain *?您可以使用 index如果找到则返回匹配位置的函数,否则返回 0。让infile.txt内容为

VAREAKAVVLRDRKSTRLN 2888
ACP*VRWPIYTACGP 292
RDRKSTRLNSSHVVTSRMP 114
VAREA*KAVVLRDRRAHV*T    73

然后

awk 'index($1,"*")==0{print $1,$2}' infile.txt

输出

VAREAKAVVLRDRKSTRLN 2888
RDRKSTRLNSSHVVTSRMP 114

请注意,如果您使用 index 而不是模式 /.../ 则不必关心具有特殊含义的字符,例如.。请注意,对于您拥有的数据,您不必明确设置字段分隔符 (FS)。 重要 ' 在 GNU AWK 中不是合法的字符串分隔符,您应该为此目的使用 ",除非您有意就是召唤难找的 bug 。

(在 gawk 4.2.1 中测试)

关于awk - 在 awk 中删除带有特殊字符的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69387272/

相关文章:

使用 awk 使用 sha1sum 进行散列

java - 合并/加入两个大文件

awk - 如何通过保留下一行来将下一行合并到当前行

linux - 如何使用 awk 或 sed 在 linux 中进行算术运算并将结果传输到文件

linux - 奇怪的 awk 行为,$1 被打印但 $0 不是?

linux - 我可以在 awk 的不同代码块中使用不同的分隔符吗?

linux - 在 bash 中内联 if else 语句

bash - 按行拆分文件并将第一个字符串保留为输出文件的标题

linux - 如何使用 AWK 来唯一化一个表(为每个唯一 ID 保留最大值)?

linux - 比较不同列的两个文件并打印不同的列