我正在 bash 脚本中使用 awk 编写 if-then-else 语句。
我想要做的是识别 col 1 值与特定字符串(rs 或 chr)不匹配的行,并将前缀 (chr) 附加到这些已识别行的 col 1 值。所有具有匹配字符串的行都应按原样打印 - 不附加。
到目前为止我的代码行是:
awk '{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}' filename > newfilename
我不断收到此代码的语法错误消息。
我可以自行成功执行识别和附加,但在将它们组合成一个命令时遇到问题。
答案1
这是您的代码,为了便于查看而进行了扩展:
awk ' { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } ' filename > newfilename
我想到了很多与此相关的问题
- 您使用相等比较而不是赋值来尝试添加
chr
前缀 - 您已将应为作业的内容放在括号中
}
第一个之后有一个无关的print $0
else
该部分之前不应有分号}
您错过了代码后的最后关闭
这是一个固定版本,仍然扩展:
awk '
{
if (! ($1 ~ /rs/ || $1 ~ /chr/) )
{
$1 = "chr" $1;
print $0
}
else
{ print $0 }
}
' filename > newfilename
然后我们可以看到一个简单的优化,将重复的内容移出print $0
您的条件:
awk '
{
if (! ($1 ~ /rs/ || $1 ~ /chr/) )
{
$1 = "chr" $1
}
print $0
}
' filename > newfilename
由于这基本上是一个简单的“条件→修改”,因此您实际上可以使用awk
的标准结构来进一步简化。这里我们有两个awk
语句,对输入文件的每一行按顺序处理。第一行"chr"
根据需要添加前缀。第二个打印每一行。
awk '
(! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 }
1
' filename > newfilename
因为这样,awk
它甚至可以卷成一行,尽管可读性会受到一点影响
awk '(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1' filename > newfilename
答案2
使用这条线似乎工作得很好:
awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'